C# IAsyncResult.AsyncWaitHandle的使用
在异步编程模型中,似乎有4种方法(如中所述)用于进行异步方法调用 调用EndInvoke()方法会使调用线程等待方法完成并返回结果 查看IAsyncResult.AsyncWaitHandle.WaitOne()似乎也会这样做。AsyncWaitHandle获取完成信号(换句话说,主线程等待异步方法的完成)。然后我们可以执行EndInvoke()来获得结果C# IAsyncResult.AsyncWaitHandle的使用,c#,.net,asynchronous,C#,.net,Asynchronous,在异步编程模型中,似乎有4种方法(如中所述)用于进行异步方法调用 调用EndInvoke()方法会使调用线程等待方法完成并返回结果 查看IAsyncResult.AsyncWaitHandle.WaitOne()似乎也会这样做。AsyncWaitHandle获取完成信号(换句话说,主线程等待异步方法的完成)。然后我们可以执行EndInvoke()来获得结果 直接调用EndInvoke()和在WaitOne()/WaitAll()之后调用它有什么区别 在轮询技术中,我们通过调用Thread.Sle
首先是简单的事情。对于第二个问题,是的,
WaitOne
和EndInvoke
确实会使当前线程在等待时休眠
对于您的第一个问题,我可以立即确定两个差异
WaitOne
需要释放等待句柄,而直接使用EndInvoke
不需要任何清理WaitOne
允许在EndInvoke
之前,但在任务完成之后执行某些操作至于那个“东西”可能是什么,我真的不知道。我怀疑在
EndInvoke
之前需要分配资源来接收输出。如果你当时真的没有理由做某事,试着不要为WaitOne
Q1而烦恼。代码或应用程序的运行方式没有差异,但可能存在一些运行时差异(同样不确定,但根据我对异步委托的理解进行猜测)
- IAsyncResult.AsyncWaitHandle主要作为同步机制提供,同时使用
WaitAll()
或WaitAny()
如果不需要此同步,则不应读取AsyncWaitHandle
属性原因:AsyncWaitHandle
不必在异步运行时由委托实现(创建),直到外部代码读取它。我不确定CLR处理异步委托的方式以及它是否创建了WaitHandler,但理想情况下,如果它能够在不创建另一个WaitHandle的情况下运行异步委托,它将不会,但是对WaitOne()的调用将创建此句柄,并且您有额外的责任处理(close)它可以有效地释放资源。因此,建议在WaitAll()
或WaitAny()
不支持同步化要求的情况下,不要读取此属性
问题2。回答睡眠和等待之间的区别。您可以将超时传递给,例如,您可以在等待操作完成时定期执行一些其他活动:
do {
//Something else
) while (!waitHandle.WaitOne(100))
将每隔100毫秒执行一次操作(+不管其他时间是多少),直到操作完成。在这种情况下,测试不是更好,而不是让线程休眠吗?MSDN页面上说:“轮询操作状态(而不是等待同步对象)的客户端使用此属性来确定操作的状态。”@stackx-但我正在等待同步对象-我之所以使用它是因为我想睡眠一段时间,但如果该任务在睡眠期间完成,我的代码立即被重新激活并退出循环(做其他事情),我明白这一点。但我的问题是,为什么你的循环需要被睡眠/等待打断?为什么不跳过睡眠/等待,更快地完成循环中的工作?您在这里考虑的具体优势是什么?