无论出于何种原因,ThreadPool
'sQueueWorkItem
都不会返回IAsyncResult
工作项的句柄或其他句柄,这将允许等待它完成。有一些RegisterWait...
方法,但是您必须通过 aWaitHandle
并且创建它们很昂贵(请参阅IAsyncResult
文档,它建议您延迟创建 aWaitHandle
直到请求)。Task Parallel Library 将解决这个缺陷,但在可用之前等待很长时间。那么,这个设计有什么问题吗:
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;
}
...
编辑:我问了一个关于使用异步委托而不是 ThreadPool 时出现的问题的后续问题。