博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1) 由于个人能力有限,关于web service异步方法调用写得不好,请大家见谅.
2) 希望大家真正去看web service异步方法和做这方面程序.


异步方法的调用的机理:它是通过回调来完成。客户首先发送调用某一个服务的异步请
求,cpu不等待这个服务接着往下执行。当这个服务完成时候,服务器会通知客户事件完
成,调用回调函数处理返回结果。而在C#中,回调函数处理模型通过委托事件实现。进一
步说,在整个服务请求的过程中,客户端为这个异步要求创建一个线程,而线程一直等待
服务器的返回结果,而线程的处理函数就是客户端的委托的函数。


异步函数的说明:每一个异步服务至少包含三个比较重要的函数。这三个函数的名称分
别 Begin+同步函数名、 End+同步函数名和 同步函数名+sync ( 补充,同步函数名是
WebService类中的提供Web Service的函数名)。

第一个函数(以begin开头的函数)说明:
1)首先,用户可以传入一个事件委托者AsyncCallback(回调函数, 请参阅msdn)。
3)它将返回一个IAsyncResult接口,它存储了当前异步请求的状态信息。

第二个函数( 以End开头的函数 ) 说明:
1) 首先,它要求把第一个函数的返回值IAsyncResult当参数传入。
2) 它的返回值,即调用服务后的结果,为object对象,我们需要强制类型转化。

第三个函数( 同步函数+sync )说明:
1) 它要求传入调用服务必须的参数值

在程序中使用异步函数的过程:

1) 添加引用.不能够通过直接添加Web Reference实现。因为通过直接添加Web
Reference只能生成同步方法而不能生成异步方法。我们需要采用另外一种办法( 请参
照我前不久发的 " 关于Web Service 的见解",同时那些命令执行是在Visual studio
2005命令行中
    (1) 通过开始菜单选中Microsoft visual studio  2005
     (2)  在子菜单中选中 Visual studio Tools
     (3)  在子菜单中选中 visual studio  2005  Command Prompt.
  )

2) 选择是否使用回调函数



由于,异步调用Web Service比较烦琐,我通过举一个简单的例子说明。在每一个Web
Service默认都有一个HelloWorld service。我们以它为例。

(1) 首先添加Web 引用,这个过程我们不再重复(请参照请参照我前不久发的帖子“
关于Web Service 的见解” 的添加引用第二种办法)

(2) 开启你的iis服务.
 
(3) 列举两种实现办法:

   第一种:基于事件完成回调函数的。
   
   class Program
{
     static void Main(string[] args)
        {

            // 生成的代理类名字为Service
            Service service = new Service();
            service.HelloWorldCompleted += new
HelloWorldCompletedEventHandler(service_helloworldCompleted);
            service.HelloWorldAsync();

            // 防止主程序提前结束
            Console.ReadLine();

 
        }

        private static void service_helloworldCompleted(object sender,
HelloWorldCompletedEventArgs args)
        {
            Console.WriteLine(args.Result.ToString());
        }
    }

  第二种通过begin函数:
class Program
{
   static void Main(string[] args)
        {

            Service service = new Service();
            IAsyncResult result = service.BeginHelloWorld(null, null);
            Object obj = service.EndHelloWorld(result);
            Console.WriteLine(obj.ToString());

 
        }
}