找回密码
 立即注册

QQ登录

只需一步,快速开始

thrall

超级版主

14

主题

174

帖子

2072

积分

超级版主

Rank: 8Rank: 8

积分
2072

活字格认证微信认证勋章

thrall
超级版主   /  发表于:2013-5-8 10:13  /   查看:6861  /  回复:0
微软早在.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()的返回值是一样的。
例如
  1. public delegate string AsyncMethodCaller((object param1, object param2);
  2.   
  3. public class AsyncDemo
  4. {

  5. private AsyncMethodCaller _asyncDelegate = new AsyncMethodCaller(Run);

  6. public IAsyncResult BeginRun(object param1, object param2, AsyncCallback asyncCallBack, Object asyncState)

  7. {

  8. asyncDelegate.BeginInvoke(param1, param2, callBack, stateObject);
  9. }

  10. public object EndRun(IAsyncResult asyncResult)

  11. {

  12. m_asyncDelegate.EndInvoke(asyncResult);
  13. }

  14. Public object Run(object param1, object param2);
  15. }
复制代码
2. IAsyncResult 对象中存储有关异步操作的信息。3. 阻止应用程序执行的几种方法a. 通过结束异步操作来阻止应用程序执行就是EndXXX() 调用时,如果 IAsyncResult 对象表示异步操作未完成,则调用线程会被阻止,就是说它之后的逻辑的会被阻止。
  1. IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);

  2. AsyncDemo.EndRun(result);

  3. // when Run() method is completed. Continue to go.

  4. ContinueToGo();
复制代码
b. 使用 AsyncWaitHandle 阻止应用程序的执行。在BeingXXX()之后调用 IAsyncResult.AsyncWAitHandle 中的相应方法也可以阻止调用线程。例如
  1. IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);

  2. // Wait until the operation completes.

  3. result.AsyncWaitHandle.WaitOne();
复制代码
c. 轮询异步操作的状态。在BeingXXX()之后调轮询IAsyncResult.IsCompleted属性来确定此操作是否已完成
  1. IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);

  2. While(result.IsCompleted != true)

  3. {

  4. // Waiting until IsCompleted is true.
  5. }

  6. // when Run() method is completed. Continue to go.

  7. ContinueToGo();
复制代码
d. 使用 AsyncCallback 委托结束异步操作。就是在代理里面根据具体情况调用Endxxx()方法来让调用线程继续运行。
  1. Public void MainFunc()

  2. {

  3. AsyncCallback callBack = new AsyncCallback(ProcessRun);

  4. IAsyncResult result = AsyncDemo.BeginRun(param1, param2, callBack, null);

  5. ContinueToGo();

  6. }

  7. Public void ProcessRun(IAsyncResult result)
  8. {

  9. AsyncDemo.EndRun(result);

  10. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部