要实现异步编程,就需要正确的实现IAsyncResult接口。IAsyncResult共有四个属性:
public interface IAsyncResult { object AsyncState { get; } WaitHandle AsyncWaitHandle { get; } bool CompletedSynchronously { get; } bool IsCompleted { get; } }名称说明 AsyncState class="sentence" style="font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;" data-source="Gets a user-defined object that qualifies or contains information about an asynchronous operation." data-guid="874e24e999ee0b6d175fc2613799856a">获取用户定义的对象,它限定或包含关于异步操作的信息。 AsyncWaitHandle 获取用于等待异步操作完成的 WaitHandle。 CompletedSynchronously 获取一个值,该值指示异步操作是否同步完成。 IsCompleted has completed." data-guid="8935c2992faf1351611af820f99c375b">获取一个值,该值指示异步操作是否已完成。
在异步完成时需将IsCompleted属性返回True,AsyncWaitHandle的等待状态设为True,CompletedSynchronously设置为True。也就是说在未完成时这些属性应该均设置为False。在Framework的4.5以前的版本中,大多数实施者不会使用该属性,应该返回False。 从 .NET Framework 4.5开始,请FromAsync方法创建的任务无法完成,如果此属性不正确实现(你将不能享受简化的异步编程async特性)。
可以使用WaitHandle的WaitOne()属性,阻止当前线程,等待完成后继续执行。如果使用IsCompleted来阻止,可以使用While(!IsCompleted){.......}跳出循环之后继续执行后续代码。