c# - 使用 Task.FromAsync 的 IAsyncResult 重载的性能成本

标签 c# .net asynchronous task

我正在尝试将一些现有的 APM 调用(BeginXEndX)包装在 Tasks 中,以获取它们的所有好处。不幸的是,我们的方法是非常规的,并且使用 out 参数,因此不能使用标准的 FromAsync 方法,在这种方法中,您同时给它提供开始和结束委托(delegate),并让它很好地包装它.

This article描述了替代方案:采用 IAsyncResult 并且只需要您实现结束回调的重载。他们获取 IAsyncResult 句柄,然后等待它完成,然后调用您传入的委托(delegate)。

这看起来不错,但后来我读了 another article about wrapping APM calls in tasks .他还提到 IAsyncResult 重载不如其他方法有效。在我看来,这意味着回调不用于报告方法的完成。这意味着他们必须使用 AsyncWaitHandle 或轮询 IsCompleted。他们使用哪一个?它有多少性能损失?

如果它正在进行轮询,这意味着回调可能不会立即到来,他们必须在整个调用过程中忙于检查它。如果他们有一个 AsyncWaitHandle,他们就会有另一个线程等待结果,这完全违背了我使用异步方法的意义。

有谁知道他们在做什么以及这种性能损失有多严重?

最佳答案

Does anyone know what they're doing and how severe this performance penalty is?

这不是非常严重,但有更多的开销。由于您没有向他们提供相同的信息(仅 IAsyncResult),因此实现必须调用 ThreadPool.RegisterWaitForSingleObjectIAsyncResult 完成时触发回调。

不使用时,有Begin/End对+回调存在,回调会自动触发任务完成,省去这里额外的wait调用。这有效地将 ThreadPool 线程绑定(bind)到等待句柄上的阻塞 (WaitOne),直到操作完成。如果这种情况很少发生,则性能开销可能可以忽略不计,但如果您多次这样做,则可能会出现问题。

关于c# - 使用 Task.FromAsync 的 IAsyncResult 重载的性能成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313114/

相关文章:

c# - 通过引用列名查找列索引?

C#:如何将当前时间放入字符串中?

actionmailer - Sidekiq 中的 perfrom_async 和 delay 有什么区别?

c# - UWP 中的绑定(bind)命令

c# - C# 中的内联 switch/case 语句

.net - 如何覆盖右键单击 WebView2 控件时出现的 ContextMenu?

.net - 阻塞 TCP 套接字写入然后立即关闭 - 这是一个问题吗?

c# - 如何保护 C# 代码不被修改

javascript - 是否可以在 Js 中使用 await 而不使用 async

java - Anko doAsync 调用不执行