在异步编程模型中,有4种方法(如异步调用同步方法中所述)用于进行异步方法调用。
调用EndInvoke()方法使调用线程等待方法完成并返回结果。
查看IAsyncResult.AsyncWaitHandle.WaitOne()似乎也是如此。AsyncWaitHandle获得完成信号(换句话说,主线程等待异步方法的完成)。然后我们可以执行EndInvoke()来获得结果。
发布于 2011-03-21 06:45:18
Q1。您的代码或应用程序的运行方式没有什么不同,但可能存在一些运行时的差异(同样不确定,但根据我对Async delegates的理解来猜测)。
WaitAll()或WaitAny(),如果您没有这种同步需要,则不应该读取AsyncWaitHandle属性。原因:AsyncWaitHandle不需要在异步运行时由委托实现(创建),直到被外部代码读取为止。我不确定CLR处理异步委托的方式,以及它是否创建了一个WaitHandler,但理想情况下,如果它能够处理运行异步委托而不创建另一个WaitHandle,它就不会这样做,但是对WaitOne()的调用将创建这个句柄,而则需要额外的责任来处理(关闭)它,以实现高效的资源释放。因此,建议在没有同步化需求(可以用WaitAll()或WaitAny()支持)时,不要读取此属性。Q2。这个问题回答了睡眠和等待之间的区别。
发布于 2011-03-21 06:39:24
简单的事情先。对于第二个问题,是的,WaitOne和EndInvoke确实会使当前线程在等待时休眠。
对于你的第一个问题,我可以立即找出两个不同之处。
WaitOne需要释放等待句柄,而直接使用EndInvoke不需要任何清理。WaitOne允许在EndInvoke之前,但在任务完成之后完成一些事情。至于什么“东西”可能是什么,我真的不知道。我怀疑分配资源来接收输出可能需要在EndInvoke之前完成。如果你真的没有理由在那一刻做些什么,试着不要用WaitOne来打扰自己。
发布于 2011-03-21 07:54:47
您可以将超时传递给WaitOne,因此您可以在等待操作完成时定期执行其他一些活动:
do {
//Something else
) while (!waitHandle.WaitOne(100))每100毫秒执行一次(+任何其他时间),直到操作完成。
https://stackoverflow.com/questions/5374121
复制相似问题