首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IAsyncResult.AsyncWaitHandle的使用

IAsyncResult.AsyncWaitHandle的使用
EN

Stack Overflow用户
提问于 2011-03-21 05:24:49
回答 3查看 6.8K关注 0票数 4

在异步编程模型中,有4种方法(如异步调用同步方法中所述)用于进行异步方法调用。

调用EndInvoke()方法使调用线程等待方法完成并返回结果。

查看IAsyncResult.AsyncWaitHandle.WaitOne()似乎也是如此。AsyncWaitHandle获得完成信号(换句话说,主线程等待异步方法的完成)。然后我们可以执行EndInvoke()来获得结果。

  1. 直接调用EndInvoke()和在WaitOne()/WaitAll()之后调用它有什么区别?
  2. 在轮询技术中,我们通过调用Thread.Sleep()为其他线程提供利用系统资源的时间。AsyncWaitHandle.WaitOne()或EndInvoke()会使主线程在等待时继续休眠吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-21 06:45:18

Q1。您的代码或应用程序的运行方式没有什么不同,但可能存在一些运行时的差异(同样不确定,但根据我对Async delegates的理解来猜测)。

  • IAsyncResult.AsyncWaitHandle主要作为一种同步机制提供,同时使用WaitAll()WaitAny(),如果您没有这种同步需要,则不应该读取AsyncWaitHandle属性。原因AsyncWaitHandle不需要在异步运行时由委托实现(创建),直到被外部代码读取为止。我不确定CLR处理异步委托的方式,以及它是否创建了一个WaitHandler,但理想情况下,如果它能够处理运行异步委托而不创建另一个WaitHandle,它就不会这样做,但是对WaitOne()的调用将创建这个句柄,而则需要额外的责任来处理(关闭)它,以实现高效的资源释放。因此,建议在没有同步化需求(可以用WaitAll()WaitAny()支持)时,不要读取此属性。

Q2。这个问题回答了睡眠和等待之间的区别。

票数 6
EN

Stack Overflow用户

发布于 2011-03-21 06:39:24

简单的事情先。对于第二个问题,是的,WaitOneEndInvoke确实会使当前线程在等待时休眠。

对于你的第一个问题,我可以立即找出两个不同之处。

  1. 使用WaitOne需要释放等待句柄,而直接使用EndInvoke不需要任何清理。
  2. 作为回报,使用WaitOne允许在EndInvoke之前,但在任务完成之后完成一些事情。

至于什么“东西”可能是什么,我真的不知道。我怀疑分配资源来接收输出可能需要在EndInvoke之前完成。如果你真的没有理由在那一刻做些什么,试着不要用WaitOne来打扰自己。

票数 4
EN

Stack Overflow用户

发布于 2011-03-21 07:54:47

您可以将超时传递给WaitOne,因此您可以在等待操作完成时定期执行其他一些活动:

代码语言:javascript
复制
do {
   //Something else
) while (!waitHandle.WaitOne(100))

每100毫秒执行一次(+任何其他时间),直到操作完成。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5374121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档