문제

이유가 무엇이든지, 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;
        }

    ...

편집 : 나는 a ThreadPool 대신 Async 대표를 사용할 때 발생하는 문제에 대한 후속 질문.

도움이 되었습니까?

해결책

글쎄, 당신은 Waithandle을 가져 오는 것과 설정 사이에 레이스 조건을 가지고 있습니다. 발신자가 조금 늦었다면 발신자가 영원히 기다리기를 원합니까?

당신은 아마도 적절한 잠금을하고 "나는 완성 된"깃발을 유지해야합니다. 하다 Waithandle이 완료된 후에는 반환하기 전에 설정했습니다.

나는 또한 개인적으로 공개 생성자를 사용하는 대신 정적 공장 방법을 작성하거나 "만들고"만들고 "생성 및 그 다음에 명시 적으로 시작 "패턴. 생성자의 작업 항목을 대기하는 것은 나에게 이상하다고 느낍니다.

다른 팁

왜 여기서 디모치로 비동기 대의원을 사용하지 않는 이유는 다음과 같습니다.

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

그것은 동시에 쓸모 없게 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top