`
wangxiaohigh
  • 浏览: 1426685 次
文章分类
社区版块
存档分类
最新评论

使用 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);
 
 }
分享到:
评论

相关推荐

    使用IAsyncResult 对象的异步操作与使用事件的异步操作

    使用IAsyncResult 对象的异步操作与使用事件的异步操作

    C#异步编程概述

    使用异步调用之前,要定义一个委托,它的方法签名要与 调用方法签名一致。.NET会自动产生此委托的BeginInvoke和EndInvoke方法。 BeginInvoke 方法用于启动异步调用。它除了具有调用方法相同的参数外,还附加了两个...

    异步编程:异步编程模型(APM)

    异步编程模型(APM)是.NET1.0的时候已经推出的古老异步编程模式,此模式基于IAsyncResult接口实现。  随着技术的发展,又在“.NET1.0异步编程模型(APM)”之后推出了“.NET2.0基于事件的编程模式”及“.NET4.X...

    C# 异步编程 AsyncCallback委托

    异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)

    System.IAsyncResult 例子

    //AsyncCallback 为客户端应用程序提供完成异步操作的方法。开始异步操作时,该回调委托被提供给客户端。AsyncCallback 引用的事件处理程序包含完成...//AsyncCallback 使用 IAsyncResult 接口获取异步操作的状态。

    异步编程:基于事件的异步编程模式(EMP)

    上一篇,我给大家介绍了“.NET1.0中基于IAsyncResult设计模式的异步编程模型(APM)”,它使用System.Threading命名空间的类来构造多线程应用程序。然而要想有效地使用这些工具类,需要有丰富的使用多线程软件工程的...

    TCPIP通讯程序的编写

    异步编程概述 讨论基于 IAsyncResult 的异步设计模式,此模式提供灵活的处理异步操作的编程模型。 使用 IAsyncResult 调用异步方法 ...介绍基于事件的异步模式,该模式提供使用事件进行跨线程通信的异步编程模型。

    异步多线程调用IAsyncResult

    异步方法执行,使用BeginInvoke (AsyncCallback委托对象) ,而不用返回值

    C#异步回调算法

    .Net使用从线程池中得到的线程来执行通过BeginInvoke()分配的方法,当异步方法执行完成时,工作线程调用回调方法而不只直接回到线程池中,要实现回调方法,我们必须在使用beginInvoke()方法的时候指定一个参数为...

    CS监听模式ReceiveCallBack(IAsyncResult AR)

    本软件是使用套接字、ReceiveCallBack(IAsyncResult AR)函数为例的客服实例,修正了关闭客户端会导致异常的Bug;并且还是一个RichTextBox颜色使用的范例,不同的事件使用不同的颜色:如用户登录用红色、用户名用绿色...

    ASP.NET实现comet的聊天交互功能

    Google一下,可以知道ASP.NET实现异步处理的话,实现IHttpAsyncHandler接口就可以了。该接口的BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)方法返回一个IAsyncResult对象。当不...

    .NET Framework 4.7.2.Socket

    EndConnect 在中启动阻止方法,在完成异步远程主机连接请求BeginConnect方法。 然后再调用BeginConnect,你需要创建实现一个回调方法AsyncCallback委托。 该回调方法在一个单独的线程中执行,并由系统后调用...

    c# socket 完成端口实例

    当前实现的 Begin/End 设计模式 System.Net.Sockets.Socket 类需要 System.IAsyncResult 对于每个异步套接字操作分配对象。 在新 System.Net.Sockets.Socket 类增强功能,异步套接字操作进行了描述可重用通过 ...

    异步调用03-轮询异步调用是否完成-c#

    可以使用由BeginInvoke方法返回的IAsyncResult的IsCompleted属性来发现异步调用何时完成。从用户界面的服务线程中进行异步调用时可以执行此操作。轮询完成允许调用线程在异步调用在线程池线程上执行时继续执行。 ...

    使用异步方式调用同步方法(实例详解)

    .NET Compact Framework 中不支持异步委托调用,也就是 BeginInvoke 和 EndInvoke 方法。 BeginInvoke 方法启动异步调用。该方法与您需要异步执行的方法具有相同的参数,还有另外两个可选参数。第一个参数是一个 ...

    C#异步调用四大方法

    C#异步调用四大方法的使用是如何进行的呢?让我们首先了解下什么时候用到C#异步调用:  .NET Framework 允许您C#异步调用任何方法。定义与您需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...

    异步方式访问网页.rar

    * 使用WaitOne方法等待异步方法执行完成 * 在指定时间之内。WaitOne方法将一直等待,直到异步调用完成,并发出通知 * ************************************************************/ /* private delegate...

    ServerToolkit:一组用于构建高性能 .NET 服务器的项目

    服务器工具包库ServerToolkit 是一组可用于构建高性能 .NET 服务器的项目。项目积极发展——已完成 85% 未来项目IAsyncResult/消息队列服务器时间戳字典纯 .NET HttpListener 异步套接字包装器

    详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿

    本文主要介绍了C#中 Thread,Task,Async/Await,IAsyncResult的相关知识。具有一定的参考价值,下面跟着小编一起来看下吧

Global site tag (gtag.js) - Google Analytics