检测ThreadPool WorkItem是否已完成/等待完成

时间:2009-01-01 22:44:33

标签: c# multithreading asynchronous concurrency threadpool

无论出于何种原因,ThreadPool的{​​{1}}都不会返回工作项的QueueWorkItem或其他句柄,这样就可以等到它完成。有IAsyncResult个方法,但您必须传递RegisterWait...并且创建它们的费用很高(请参阅WaitHandle文档,建议您在请求之前延迟创建IAsyncResult。任务并行库将解决这个问题,但在可用之前需要等待很长时间。那么,这个设计有什么问题:

WaitHandle

编辑: 我问了follow-up question about the concerns which arise when using async delegates instead of the ThreadPool

2 个答案:

答案 0 :(得分:6)

嗯,你在获取WaitHandle和设置它之间遇到了竞争条件。如果他们碰巧有点迟到,你真的希望呼叫者永远等待吗?

你应该做一些适当的锁定并保持一个“我已经完成”的标志,这样如果你在它完成后创建WaitHandle,你可以在返回之前设置它。

我还会亲自编写一个静态工厂方法,而不仅仅是使用公共构造函数 - 或者将其设置为“create and then 显式启动”模式。在构造函数中排队工作项对我来说很奇怪。

答案 1 :(得分:3)

为什么不使用异步委托,如下所示:

http://msdn.microsoft.com/en-us/library/h80ttd5f.aspx

那会使Concurrent过时,不是吗?