[c#] 检测到一个ThreadPool WorkItem已经完成/等待完成


Answers

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

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

那会使Concurrent过时,不是吗?

Question

无论出于何种原因, ThreadPoolQueueWorkItem不会返回一个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;
        }

    ...

编辑:我问了一个关于使用异步委托,而不是ThreadPool时出现的问题后续问题






Links