控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

使用 IAsyncResult 进行 .NET 异步编程

作者:未知 出处:cnblog 2012年09月17日 阅读:

 微软早在.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);
  
 }

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统