精华内容
下载资源
问答
  • 异步调用webservice

    2019-01-07 22:58:41
    异步调用webservice    今天学习webservice的异步调用。找了很多都是说会在客户端生成的Proxy类中会生成Begin<方法名>和End<方法名>,然后在这两个方法之间调用自己的代码的方式...

    异步调用webservice

     

          今天学习webservice的异步调用。找了很多都是说会在客户端生成的Proxy类中会生成Begin<方法名>和End<方法名>,然后在这两个方法之间调用自己的代码的方式实现异步操作。

      但是,在客户端的Proxy类中没有这样的方法,相反的却有<方法名>Async的方法。这个是不是新的异步调用新的实现方式呢?于是网上找了找发现了两篇很有价值的博文。

      一篇引用自http://book.51cto.com/art/200906/129768.htm,是李天平的。

         文中讲了两种异步调用的方法。一种是用后台线程直接调用webservice。webservice本身没有什么不同,就是最直接的调用。异步主要是通过后台线程(BackgroundWorker,仅WinForm中调用)实现。

      文中代码引用如下:

     1    private   void  button1_Click( object  sender, EventArgs e)  
     2   {  
     3       BackgroundWorker backgroundworker  =   new  BackgroundWorker();  
     4        // 注册具体异步处理的方法  
     5       backgroundworker.DoWork  +=   new  DoWorkEventHandler(back_DoWork);  
     6        // 注册调用完成后的回调方法  
     7       backgroundworker.RunWorkerCompleted  +=    
     8            new  RunWorkerCompletedEventHandler(back_RunWorkerCompleted);  
     9        // 这里开始异步调用  
    10       backgroundworker.RunWorkerAsync();  
    11        // 调用服务的同时客户端处理并不停止  
    12       ChangeProcessBar();   
    13   }  
    14    // 完成事件  
    15    void  back_RunWorkerCompleted( object  sender, RunWorkerCompletedEventArgs e)  
    16   {  
    17        if  (e.Error  !=   null )  
    18            throw  e.Error;  
    19       progressBar1.Value  =  progressBar1.Maximum;  // 调用完成了,把客户端进度条填充满  
    20        string  price  =  e.Result.ToString();    // 获取处理结果  
    21       MessageBox.Show( " 调用完成。价格是: "   +  price);  // 显示从服务器获取的结果值  
    22   }  
    23    // 调用方法  
    24    void  back_DoWork( object  sender, DoWorkEventArgs e)  
    25   {  
    26        // Web Service代理类  
    27       ProductService.LTPService service  =   new  ProductService.LTPService();  
    28        // 调用Web方法GetClass1,将结果赋值给DoWorkEventArgs的Result对象  
    29       e.Result  =  service.GetProductPrice( " 001 " );   
    30   } 

     

    进度条显示函数:

     1  // <summary>  
     2  // 界面的进度条显示  
     3  // </summary>  
     4  void  ChangeProcessBar()  
     5  {  
     6       for  ( int  i  =   0 ; i  <   10 ; i ++ )  
     7      {  
     8          progressBar1.Value  =  i;  
     9          System.Threading.Thread.Sleep( 500 );  
    10      }  
    11 

     

     

      第二种异步调用的方法是调用webservice内置的异步调用方式。这里主要就要调用<WebService方法名>Async方法来实现异步的。

      原文代码引用如下:

     1  private   void  button2_Click( object  sender, EventArgs e)  
     2  {  
     3       // Web Service代理类  
     4      ProductService.LTPService service  =   new  ProductService.LTPService();  
     5       // 这里开始异步调用  
     6      service.GetProductPriceAsync( " 001 " );   
     7       // 注册调用完成后的回调方法  
     8      service.GetProductPriceCompleted  +=   new  ProductService.  
     9          GetProductPriceCompletedEventHandler(GetProductPriceCompleted);  
    10       // 调用同时客户端处理不停止    
    11      ChangeProcessBar();  
    12  }  
    13  // 完成事件处理方法  
    14  void  GetProductPriceCompleted( object  sender, ProductService.  
    15              GetProductPriceCompletedEventArgs e)  
    16  {  
    17       if  (e.Error  !=   null )  
    18           throw  e.Error;  
    19      progressBar1.Value  =  progressBar1.Maximum;   // 调用完成了,把客户端进度条填充满  
    20       string  price  =  e.Result.ToString();          // 获取处理结果  
    21      MessageBox.Show( " 调用完成。价格是: "   +  price);    // 显示从服务器获取的结果值  
    22 

     

     

          另外一篇博文是冯东的,其中正好对上面讲到的内容作了些补充和总结,以及在Ajax方面做了些扩展叙述。

      其中有一点,就是在Web页面的属性中添加Async="true",以使页面可以调用webservice内置的异步功能。

      Web Method代码引用如下:

    1     [WebMethod]
    2      public  DLL.EmployeesDataTable getEmployee()
    3     {
    4        DLL.EmployeesDataTable result  =   new  DLL.EmployeesDataTable();
    5        DLLTableAdapters.EmployeesTableAdapter eta  =   new  WebServiceAsyn.DLLTableAdapters.EmployeesTableAdapter();
    6        eta.FillEmployee(result);
    7         return  result;
    8     }

     

      客户端调用代码引用如下:

     1  / 实体化WebService引用
     2  private  AsynWebService.Service1 asynSer;
     3  // 构造函数初始化 WebService引用,并为异步调用WebService设置好了结果处理函数【方法名Completed】(先这么叫吧,我也不知道怎么叫)
     4  public  _Default()
     5  {
     6      asynSer  =   new  AsynWebService.Service1();
     7      asynSer.HelloWorldCompleted  +=   new  AsynWebService.HelloWorldCompletedEventHandler(asynSer_HelloWorldCompleted);
     8      asynSer.getEmployeeCompleted  +=   new  AsynWebService.getEmployeeCompletedEventHandler(asynSer_getEmployeeCompleted);
     9  }
    10  protected   void  Button1_Click( object  sender, EventArgs e)
    11  {
    12       // 开始异步调用HelloWorld;
    13      asynSer.HelloWorldAsync();
    14  }
    15 
    16  protected   void  asynSer_HelloWorldCompleted( object  sender, AsynWebService.HelloWorldCompletedEventArgs e)
    17  {
    18       this .Label1.Text  =  e.Result.ToString();
    19  }
    20 
    21  protected   void  asynSer_getEmployeeCompleted( object  sender, AsynWebService.getEmployeeCompletedEventArgs e)
    22  {
    23       this .GridView1.DataSource  =  e.Result;
    24       this .GridView1.DataBind();
    25  }
    26  protected   void  Button2_Click( object  sender, EventArgs e)
    27  {
    28       // 开始异步调用getEmployee
    29      asynSer.getEmployeeAsync();
    30  }

     

     

       下面是作者给出的Ajax的异步调用和作者对这两种异步调用方式的总结:

     1  < script language = " javascript "  type = " text/javascript " >
     2       var  xmlHttp;
     3       function  createXMLHttpRequest()
     4      {
     5       if (window.ActiveXObject)
     6      {
     7         xmlHttp  =   new  ActiveXObject( " Microsoft.XMLHTTP " );
     8      }
     9       else   if (window.XMLHttpRequest)
    10      {
    11         xmlHttp  =   new  XMLHttpRequest();
    12      }        
    13     }
    14      
    15       function  requestStart()
    16      {
    17           if (document.getElementById( " tbx1 " ).value.length  <=   4 )
    18          {
    19              alert( " 用户名的长度要求大于4个字符! " );
    20               return   false ;
    21          }
    22          document.getElementById( " sp1 " ).innerText  =   " Loding " ;
    23           var  url  =   " default.aspx?userName= "   +  document.getElementById( " tbx1 " ).value;
    24      createXMLHttpRequest(); // 创建XMLHttpRequest对象
    25      xmlHttp.onreadystatechange  =  callBack; // 为XMLHttpRequest对象指定结果处理函数
    26      xmlHttp.open( " GET " ,url); // 打开链接
    27      xmlHttp.send( null ); // 发送请求
    28      }
    29       // 结果处理函数                
    30       function  callBack()
    31      {
    32       if (xmlHttp.readyState  ==   4 )
    33      {
    34         document.getElementById( " sp1 " ).innerText  =  xmlHttp.responseText;
    35      }
    36      }        
    37  < / script>

     

      作者给出的总结

      1:Ajax需要创建XMLHttpRequest对象,Asp.Net需要实体化WebService代理类对象
      2:XMLHttpRequest 对象需要指定结果处理函数,Asp.Net也需要指定结果处理函数
      3:XMLHttpRequest的结果处理函数必须在请求发送之前设置,Asp.Net同样也是需要在              方法被调用之前设置好结果处理函数

          作者还提到了一些Flex中的异步调用webservice的知识,用兴趣的同学可以到作者的原文中查看。

     

     

    引用博文:

    http://book.51cto.com/art/200906/129768.htm

    http://www.cnblogs.com/interboy/archive/2007/04/06/702594.html

         

    展开全文
  • 异步调用WebService

    2011-09-30 09:28:00
    这里用Winform演示如何异步调用WebService。  首先在界面中拖入2个按纽,一个是同步,一个是异步,作为比较。新建立一个WebService,就用默认的HelloWorld方法来演示。  在Winform中添加对这个WebService的引用...

      这里用Winform演示如何异步调用WebService。

      首先在界面中拖入2个按纽,一个是同步,一个是异步,作为比较。新建立一个WebService,就用默认的HelloWorld方法来演示。

      在Winform中添加对这个WebService的引用,button1(同步按纽)和button2(异步按纽)中的事件如下:

            private void button1_Click(object sender, EventArgs e)
    {
    localhost.Service1 service = new AsyncWebService.localhost.Service1();
    string s = service.SayHello();
    MessageBox.Show("Main do something...");
    Thread.Sleep(3000);
    MessageBox.Show("Main done.");
    MessageBox.Show(s);
    }

    localhost.Service1 myService;
    private void button2_Click(object sender, EventArgs e)
    {
    //初始化WebService
    myService = new AsyncWebService.localhost.Service1();
    //给HelloWorld方法注册调用完成时执行的方法AsyncHelloWorldComplete
    myService.HelloWorldCompleted += new AsyncWebService.localhost.HelloWorldCompletedEventHandler(AsyncHelloWorldComplete);
    //开始异步调用
    myService.HelloWorldAsync();
    MessageBox.Show("Main do something...");
    Thread.Sleep(3000);
    MessageBox.Show("Main done.");
    }
    //异步调用完成时执行的方法
    private void AsyncHelloWorldComplete(object sender, AsyncWebService.localhost.HelloWorldCompletedEventArgs e) {
    string s = e.Result.ToString();
    MessageBox.Show(s);
    }

      在第二个按纽myService中有关于HelloWorld的有这几个:

        1.HelloWorld  这是同步执行的方法

        2.HelloWorldAsync  这是开始异步执行的方法

        3.HelloWorldCompleted  这是HelloWorld方法执行完成的事件,以上给这个事件注册了一个委托HelloWorldCompletedEventHandler,可以右击》GoToDefinition查看这个委托,这个委托有2个参数:object sender, HelloWorldCompletedEventArgs e,对于第二个参数e.Result就是需要异步执行的WebService方法(HelloWorld()方法)的返回结果。

      如果是在ASP.NET中异步执行的话,需要在页面属性中设置可以异步:Async="true"

      使用javascript,Ajax(异步)调用WebService的方法参考:使用ASP.NET AJAX异步调用Web Service和页面中的类方法

    转载于:https://www.cnblogs.com/johnsmith/archive/2011/09/30/2196126.html

    展开全文
  • webservice8 异步调用webservice
  • 异步调用Webservice

    2006-12-28 11:43:00
    异步调用Webservice的方法及实例代码如下:主方法(调用Webservice的方法): ArrayListal=newArrayList();localhost.TestServicets=newTestWebPro.localhost.TestService();//这是Webservice在本地的代理类System....


    异步调用Webservice的方法及实例代码如下:

    主方法(调用Webservice的方法):

    None.gif ArrayList al  =   new  ArrayList();
    None.giflocalhost.TestService ts 
    =   new  TestWebPro.localhost.TestService(); // 这是Webservice在本地的代理类
    None.gif
    System.Threading.ManualResetEvent mre  =   new  System.Threading.ManualResetEvent( false );
    None.gifal.Add(ts);
    None.gifal.Add(mre);
    None.gif   
    None.gif
    // 执行异步调用,localhost.TestEnum.bus是自定义的枚举,用做调用方法的参数
    None.gif
    System.IAsyncResult ar  =  ts.BeginTestMethod(localhost.TestEnum.bus, new  System.AsyncCallback( this .EndCall),al);
    None.gif
    None.gif
    // dot.gif.执行其它操作
    None.gif

    None.gifmre.WaitOne();
    // 等待调用完成
    None.gif
    None.gif
    // dot.gif.继续执行其它操作


    回调方法EndCall(调用完成后执行的方法):

    None.gif public   void  EndCall(System.IAsyncResult ar)
    ExpandedBlockStart.gifContractedBlock.gif
    dot.gif {
    InBlock.gif 
    try
    ExpandedSubBlockStart.gifContractedSubBlock.gif 
    dot.gif{
    InBlock.gif  ArrayList al 
    = (ArrayList)ar.AsyncState;
    InBlock.gif  localhost.TestService ts 
    = (localhost.TestService)al[0];
    InBlock.gif  System.Threading.ManualResetEvent mre 
    = (System.Threading.ManualResetEvent)al[1];
    InBlock.gif
    InBlock.gif  
    string s = ts.EndTestMethod(ar);//获得调用结果
    InBlock.gif
        
    InBlock.gif  mre.Set();
    //通知主方法可以继续执行
    ExpandedSubBlockEnd.gif
     }

    InBlock.gif 
    catch(Exception ex)
    ExpandedSubBlockStart.gifContractedSubBlock.gif 
    dot.gif{
    InBlock.gif  
    throw ex;
    ExpandedSubBlockEnd.gif }

    ExpandedBlockEnd.gif}


    如果主方法和回调方法在同一个类就可以把ts和mre声明成私有全局变量,而不用通过IAsyncResult.AsyncState来传递到回调函数中。

    转载于:https://www.cnblogs.com/RainyWolf/archive/2006/12/28/605836.html

    展开全文
  •  二:异步调用  不会阻塞启动操作的调用线程,调用程序必须通过轮流检测,或者等待完成信号来发现调用的完成   三:同步调用WebService  同步调用WebService就是我们平常的调用的写法  1:AsynCall.asmx的...
  • 同步调用WebService和异步调用WebService

    千次阅读 2013-11-16 16:45:43
     四:异步调用WebService  一:同步调用  一个同步操作会阻塞整个当前的进程,直到这个操作完成才能执行下一段代码   二:异步调用  不会阻塞启动操作的调用线程,调用程序必须通过轮流检测,或者等待...

    阅读目录

      一:同步调用

      二:异步调用

      三:同步调用WebService

      四:异步调用WebService

      一:同步调用

      一个同步操作会阻塞整个当前的进程,直到这个操作完成才能执行下一段代码

    \


     

    二:异步调用

      不会阻塞启动操作的调用线程,调用程序必须通过轮流检测,或者等待完成信号来发现调用的完成

    \

     

    三:同步调用WebService

      同步调用WebService就是我们平常的调用的写法

      1:AsynCall.asmx的AsynCall.cs代码

      /// <summary>
          /// 根据学生姓名得到该学生的成绩
         /// </summary>
         /// <param name="strName">学生姓名</param>
         /// <param name="intDelaySecond">延迟的秒数</param>
         /// <returns>成绩</returns>
         [WebMethod]
         public int GetGrade(string strName, int intDelaySecond)
         {
             if (intDelaySecond > 0)
             {
                 Thread.Sleep(intDelaySecond * 1000);
             }
             int intGrade = 0;
             switch (strName)
             {
                 case "张三":
                    intGrade = 90;
                    break;
                 case "李四":
                    intGrade = 80;
                    break;
                 case "王五":
                    intGrade = 70;
                    break;
                 case "贾六":
                    intGrade = 60;
                    break;
             }
             return intGrade;
         }

      2:Program.cs

       AsynCall.AsynCall service = new AsynCall.AsynCall();
           Console.WriteLine("请输入要查询成绩的学生的姓名:");
           string strName = Console.ReadLine();
           Console.WriteLine("请输入要延迟的秒数:");
           int intSecond = int.Parse(Console.ReadLine());
           #region 同步调用开始 www.2cto.com
           Console.WriteLine("同步调用开始");
           Console.WriteLine("同步调用结果为:" + service.GetGrade(strName, intSecond));
           Console.WriteLine("同步调用结束");

       Console.ReadLine();
           #endregion

       我们输入30秒看看运行效果

    \


    因为我们输入的是30秒,所以我们要等到30秒后才能输出“同步调用结果为:90”和“同步调用结束”这句话
      
      
     

    四:异步调用WebService

      . .NET Framework为异步化的编程模型提供了必要的服务

      . 决定特定的调用是否应该异步处理是由客户端也就是调用者决定,我们看到WebService本身并没有发生变化,发生变化的是客户端,是调用端

      . 不需要进行额外的编程

      . 代理类提供了WebService的方法名+Async()作为异步调用WebService的方法名

      . 异步调用的实质是调用者线程和被调用者线程并行执行的过程

       #region 异步调用
           Console.WriteLine("异步调用开始");

       //'+='表示事件的预定,'new AsynCall.GetGradeCompletedEventHandler(service_Completed)'表示利用编写的事件处理程序生成一个委托实例,'service.GetGradeCompleted'表示添加什么到产生事件对象的事件列表当中去,合起来解释就是把这个委托实例添加到产生事件对象的事件列表当中去,这个过程叫做订阅事件,委托就是代理,我们可以这样理解,委托就是把一个事件处理函数和一个事件关联起来
           service.GetGradeCompleted += new AsynCall.GetGradeCompletedEventHandler(service_Completed);
           //开始异步调用
           service.GetGradeAsync(strName, intSecond);
           Console.WriteLine("当前进程没有被阻塞");
           for (int i = 0; i < 3; i++)
           {
                 Console.WriteLine(i);
           }
           Console.ReadLine();
            #endregion

         private static void service_Completed(object sender, AsynCall.GetGradeCompletedEventArgs e)
            {
                Console.WriteLine("异步调用结果为:" + e.Result);
                Console.WriteLine("异步调用结束");
            }

      我们同样输入30秒看看运行效果


     
      
      因为我们输入的还是30秒,所以我们要等到30秒后才能输出“异步调用结果为:90”这句话,这是谁也改变不了的,但是和同步调用不同之处在于,“当前进程没有被阻塞”和for循环立即就输出了,所以证明你在延迟30秒的时候,我继续执行我下面的代码,你延迟你的我不管,我不等你,等你到猴年马月了,我继续做我的事情
     
        
     
    每天学习一点点,每天进步一点点 用文字记录工作,用文字记录人生

    展开全文
  • 异步调用webservice返回responseXML为空,详细很多朋友都遇到过类似的问题吧,接下来为大家提供详细的解决方案,感兴趣的朋友可以参考下哈
  • 异步调用WebService.zip

    2013-09-17 14:12:46
    这个是利用异步调用WebService的一个示例,是用asp.net开发的。供大家学习,谢谢!
  • 异步调用WEBSERVICE

    千次阅读 2008-04-09 15:36:00
    异步调用WEBSERVICEWeb 服务描述语言工具 (Wsdl.exe) 生成客户端代理类来访问指定的 Web 服务时,会为该代理类提供与每个 Web 服务方法进行异步通信的两种机制。第一种机制是 Begin/End 模式。第二种机制是在 .NET ...
  • C# ajax 异步调用webservice方法
  • 这里用Winform演示如何异步调用WebService。  首先在界面中拖入2个按纽,一个是同步,一个是异步,作为比较。新建立一个WebService,就用默认的HelloWorld方法来演示。  在Winform中添加对这个WebService
  • 由于asp2.0提供了异步页的支持使异步调用WebService的性能有了真正的提升。 使用异步页,首先要设置Async="true",异步页是在Prerender和PrerenderComplete事件间加入Begin,end异步方法实现的,Begin和End方法属于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,086
精华内容 6,034
关键字:

异步调用webservice