无论出于何种原因,
ThreadPool
的QueueWorkItem
方法不返回IAsyncResult
或其他处理工作项的句柄,这使得无法等待工作项完成。虽然有RegisterWait...
方法,但需要传递一个WaitHandle
,而创建它们是昂贵的(请参阅IAsyncResult
文档,建议在请求时再创建WaitHandle
)。任务并行库将解决这个问题,但要等很长时间才能使用。那么,这种设计是否存在任何问题:public class Concurrent<T> {
private ManualResetEvent _resetEvent;
private T _result;
public Concurrent(Func<T> f) {
ThreadPool.QueueUserWorkItem(_ => {
_result = f();
if (_resetEvent != null)
_resetEvent.Set();
});
}
public WaitHandle WaitHandle {
get {
if (_resetEvent == null)
_resetEvent = new ManualResetEvent(_result != null);
return _resetEvent;
}
...
编辑: 我提出了一个关于使用异步委托而不是线程池时可能出现的问题的后续问题。
_result != null
作为ManualResetEvent构造函数的参数传递。(对于结构体不起作用,但是思想是相同的。)_result != null
在这里充当完成标志(当然不是在实际实现中)。是的,这里需要谨慎地加锁。(续...) - Alexey Romanov_result != null
(如果方法抛出异常,这也会导致工作失误)。 - Alexey Romanov