要实现异步编程,就需要正确的实现IAsyncResult接口。IAsyncResult共有四个属性:
public interface IAsyncResult{ object AsyncState { get; } WaitHandle AsyncWaitHandle { get; } bool CompletedSynchronously { get; } bool IsCompleted { get; }}
成员 | 说明 |
---|---|
| 一个可选的应用程序特定的对象,包含有关异步操作的信息。 |
| 一个 ,可用来在异步操作完成之前阻止应用程序执行。 |
| 一个值,指示异步操作是否是在用于调用 Begin操作名称 的线程上完成,而不是在单独的 线程上完成。 |
| 一个值,指示异步操作是否已完成。 |
在异步完成时需将IsCompleted属性返回True,AsyncWaitHandle的等待状态设为True,CompletedSynchronously设置为True。也就是说在未完成时这些属性应该均设置为False。在Framework的4.5以前的版本中,大多数实施者不会使用该属性,应该返回False。 从 .NET Framework 4.5开始,请FromAsync方法创建的任务无法完成,如果此属性不正确实现(你将不能享受简化的异步编程async特性)。
可以使用WaitHandle的WaitOne()属性,阻止当前线程,等待完成后继续执行。如果使用IsCompleted来阻止,可以使用While(!IsCompleted){.......}跳出循环之后继续执行后续代码。