• C# Web Service 或WCF時,使用異步方法,回調涵數的理解


    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());

     
            }
    }

  • 相关阅读:
    SLAM基础知识
    标准的机器学习问题
    LAS的数据格式
    Python中的多线程和多进程
    【go】log
    【亲密关系】3-吸引力
    【mysql】做 mariadb 的备库无法启动
    【zabbix-server】Supervising process xxxx which is not our child....exits
    【win10】添加程序自启动
    【Oralce】数据去重,限制某个字段的数据长度,替换空格符
  • 原文地址:https://www.cnblogs.com/guyuehuanhuan/p/2514955.html
Copyright © 2020-2023  润新知