c# - IAsyncResult.AsyncWaitHandle 的使用

标签 c# .net asynchronous

在异步编程模型中,似乎有 4 种方式(如 Calling Synchronous Methods Asynchronously 中所述)进行异步方法调用。

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

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

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

  2. 在轮询技术中,我们通过调用 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/

相关文章:

c# - 基于 switch-case 结果在同一个变量上使用不同构造函数的方法

c# - 如何在 WinForms 项目中将 XML 用作 DataGridView 的数据源?

android - 使用 RoboSpice 进行异步线程

c# - xamarin Studio for ios 在 Windows 上?

c# - 使用 c# asp.net mvc3 在单个页面上绘制多个图表

c# - 计算玩家输赢百分比

.net - 打包/发布Azure项目时出现System.OutOfMemoryException

c# - .NET Async 中的可伸缩性与响应能力

c# - 异步任务的有效速率限制(每个时间间隔执行 N 次)

javascript - 我如何解释 setTimeout 的这种行为?