zoukankan      html  css  js  c++  java
  • 使用 IAsyncResult 进行 .NET 异步编程

    微软早在.net2.0, 也就是VS2005的时候,就提供了一整套的异步编程设计模式,有3中常用的方式:

    1. 使用 IAsyncResult 调用异步方法

    2. 使用委托进行异步编程

    3. 使用事件进行异步多线程编程

    注: IAsyncResult 方式通常是用委托来实现的。所以可以认为前面2种方式就是一种。

    http://msdn.microsoft.com/zh-cn/library/2e08f6yc.aspx

    使用 IAsyncResult 调用异步方法

    1. 有两个配对的方法,BeginXXX() 和 EndXXX()。它们是XXX()方法的异步执行。

    BegingXXX()的参数是在XXX()的参数基础上增加 AsyncCallback 和 AsyncState。

    EndXXX()的返回值和XXX()的返回值是一样的。

    例如

    public delegate string AsyncMethodCaller((object param1, object param2);
      
    public class AsyncDemo
    {
     
     private AsyncMethodCaller _asyncDelegate = new AsyncMethodCaller(Run);
     
     public IAsyncResult BeginRun(object param1, object param2, AsyncCallback asyncCallBack, Object asyncState)
     
     {
     
     asyncDelegate.BeginInvoke(param1, param2, callBack, stateObject); 
     }
     
     public object EndRun(IAsyncResult asyncResult)
     
    {
     
    m_asyncDelegate.EndInvoke(asyncResult); 
     }
     
     Public object Run(object param1, object param2); 
    }
     

    2. IAsyncResult 对象中存储有关异步操作的信息。

    3. 阻止应用程序执行的几种方法

    a. 通过结束异步操作来阻止应用程序执行

    就是EndXXX() 调用时,如果 IAsyncResult 对象表示异步操作未完成,则调用线程会被阻止,就是说它之后的逻辑的会被阻止。

     IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);
     
     AsyncDemo.EndRun(result);
     
     // when Run() method is completed. Continue to go.
     
    ContinueToGo();

    b. 使用 AsyncWaitHandle 阻止应用程序的执行。

    在BeingXXX()之后调用 IAsyncResult.AsyncWAitHandle 中的相应方法也可以阻止调用线程。例如

     IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);
     
     // Wait until the operation completes.
     
     result.AsyncWaitHandle.WaitOne();

    c. 轮询异步操作的状态。

    在BeingXXX()之后调轮询IAsyncResult.IsCompleted属性来确定此操作是否已完成

    IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);
     
     While(result.IsCompleted != true)
     
     {
     
     // Waiting until IsCompleted is true. 
     }
     
     // when Run() method is completed. Continue to go.
     
     ContinueToGo();
     

    d. 使用 AsyncCallback 委托结束异步操作。

    就是在代理里面根据具体情况调用Endxxx()方法来让调用线程继续运行。

    Public void MainFunc()
     
     {
     
     AsyncCallback callBack = new AsyncCallback(ProcessRun);
     
     IAsyncResult result = AsyncDemo.BeginRun(param1, param2, callBack, null);
     
     ContinueToGo();
     
     }
     
     Public void ProcessRun(IAsyncResult result) 
     {
     
     AsyncDemo.EndRun(result);
     
     }


    本文是由葡萄城技术开发团队发布,转载请注明出处:葡萄城官网


  • 相关阅读:
    solr schema.xml配置
    solrconfig.xml配置文件
    solr 使用edismax来控制评分
    solr 打分和排序机制(转载)
    VMware vCenter Converter Standalone使用,物理机转换虚拟机
    Windows server开机登录取消按ctrl+alt+delete组合键
    pycharm专业版2020.1.1版本最新亲测激活,其他版本也复用
    jmeter服务器监控和插件管理
    windows下安装navicat15破解,详解最全
    linux解压汉字文件是乱码
  • 原文地址:https://www.cnblogs.com/powertoolsteam/p/1997900.html
Copyright © 2011-2022 走看看