Ran*_*ngy 6 .net c# asynchronous task
我正在尝试将一些现有的APM调用(BeginX,EndX)包装Tasks进去,以获得它们的所有好处.不幸的是,我们的方法是非常规的并使用out参数,所以不能使用标准FromAsync方法,你给它的开始和结束代表,并让它很好地包装它.
本文描述了另一种选择:一个带有a的重载,IAsyncResult只需要你实现结束回调.他们拿走IAsyncResult句柄,然后等到它完成,然后调用你传入的代表.
这似乎很好,但后来我读了另一篇关于在任务中包装APM调用的文章.他还提到IAsyncResult过载不如其他方法有效.在我看来,这意味着回调不用于报告方法的完成.这意味着他们必须使用AsyncWaitHandle或轮询IsCompleted.他们使用哪一个?它的性能损失是多少?
如果它正在进行轮询,这意味着回调可能不会立即发生,他们必须在整个通话期间忙着检查它.如果他们有一个AsyncWaitHandle,他们有另一个线程坐着等待结果,这完全打败了我使用异步方法的意义.
有谁知道他们在做什么以及这种性能损失有多严重?
有谁知道他们在做什么以及这种性能损失有多严重?
这并不是非常严重,但开销更大。由于您没有向它们提供相同的信息(仅提供IAsyncResult),因此实现必须调用ThreadPool.RegisterWaitForSingleObject以在完成时触发回调IAsyncResult。
当不使用此功能并且存在 Begin/End 对 + 回调时,回调会自动触发任务完成,从而消除此处额外的等待调用。这有效地将 ThreadPool 线程绑定在等待句柄上(WaitOne),直到操作完成。如果这种情况很少发生,则性能开销可能可以忽略不计,但如果您经常这样做,则可能会出现问题。
| 归档时间: |
|
| 查看次数: |
1764 次 |
| 最近记录: |