在异步编程模型中,似乎有 4 种方式(如 Calling Synchronous Methods Asynchronously 中所述)进行异步方法调用。
调用 EndInvoke() 方法使调用线程等待方法完成并返回结果。
通过 IAsyncResult.AsyncWaitHandle.WaitOne() 似乎也有同样的作用。 AsyncWaitHandle 获得完成信号(换句话说,主线程等待异步方法的完成)。然后我们可以执行 EndInvoke() 来获取结果。
直接调用 EndInvoke() 和在 WaitOne()/WaitAll() 之后调用有什么区别?
在轮询技术中,我们通过调用 Thread.Sleep() 为其他线程提供时间来利用系统资源。 AsyncWaitHandle.WaitOne() 或 EndInvoke() 是否使主线程在等待时继续休眠?
最佳答案
Q1。您的代码或应用程序的运行方式没有差异,但可能存在一些运行时差异(再次不确定,但根据我对Async delegates
的理解进行猜测)。
- IAsyncResult.AsyncWaitHandle 主要作为同步机制提供,如果您没有此同步需求,则使用
WaitAll()
或WaitAny()
你不应该阅读AsyncWaitHandle
属性。 原因:AsyncWaitHandle
在异步运行时不必由委托(delegate)实现(创建),直到它被外部代码读取为止。我不确定 CLR 处理异步委托(delegate)的方式以及它是否创建 WaitHandler ,但理想情况下,如果它可以处理运行你的异步委托(delegate)而不创建另一个 WaitHandle 它不会,但你调用 WaitOne() 会创建这个处理并且您有额外的责任处置(关闭)它以有效释放资源。因此,建议在没有WaitAll()
或WaitAny()
支持的同步要求时不要读取此属性。
Q2。 This Question回答 sleep 和等待之间的区别。
关于c# - IAsyncResult.AsyncWaitHandle 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5374121/