IAsyncResult.AsyncWaitHandle 的使用

Sar*_*gam 4 .net c# asynchronous

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

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

通过 IAsyncResult.AsyncWaitHandle.WaitOne() 似乎也做了同样的事情。AsyncWaitHandle 获取完成信号(换句话说,主线程等待异步方法的完成)。然后我们可以执行EndInvoke()来得到结果。

  1. 直接调用 EndInvoke() 和在 WaitOne()/WaitAll() 之后调用有什么区别?

  2. 在轮询技术中,我们通过调用 Thread.Sleep() 为其他线程提供利用系统资源的时间。AsyncWaitHandle.WaitOne() 或 EndInvoke() 是否使主线程在等待时进入睡眠状态?

San*_*ath 6

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

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

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