문제

나는 일반적으로 인터페이스를 부분적으로 구현하는 것에주의를 기울입니다. 하지만, IAsyncResult 몇 가지 다른 사용 패턴을 지원한다는 점을 감안할 때 약간의 특별한 경우입니다. 얼마나 자주 사용/참조합니까? AsyncState/AsyncCallback 단지 전화와는 반대로 패턴 EndInvoke, 사용 AsyncWaitHandle, 또는 폴링 IsCompleted (왝)?

관련 질문 : ThreadPool Workitem이 완료/완료 대기를 감지.

이 클래스를 고려하십시오 (매우 근사하고 잠금 필요) :

public class Concurrent<T> {
    private ManualResetEvent _resetEvent;
    private T _result;

    public Concurrent(Func<T> f) {
        ThreadPool.QueueUserWorkItem(_ => {
                                         _result = f();
                                         IsCompleted = true;
                                         if (_resetEvent != null)
                                             _resetEvent.Set();
                                     });
    }

    public WaitHandle WaitHandle {
        get {
            if (_resetEvent == null)
                _resetEvent = new ManualResetEvent(IsCompleted);
            return _resetEvent;
        }

    public bool IsCompleted {get; private set;}
    ...

가지고 있습니다 WaitHandle (Lazely가 설명한대로 만들어졌습니다 IAsyncResult 문서) 및 IsCompleted, 그러나 나는 현명한 구현이 보이지 않습니다 AsyncState ({return null;}?). 또한 구현하는 것이 합리적입니다 IAsyncResult? 주목하십시오 Task 병렬 확장에서 라이브러리가 구현됩니다 IAsyncResult, 그러나만 IsCompleted 암시 적으로 구현됩니다.

도움이 되었습니까?

해결책

  • 내 경험상, 대기하거나 먼저 전화를받지 않고 Endinvoke에게 전화하는 것만으로도 유용하지 않습니다.
  • 고객이 한 번에 여러 운영을 기다리기를 원할 수 있으므로 콜백을 제공하는 것만으로는 충분하지 않습니다 (Waitany, Waitall).
  • 나는 iscompleted를 폴링 한 적이 없다. 따라서 iscompleted의 구현을 저장할 수는 있지만 너무 간단해서 고객을 놀라게 할 가치가없는 것 같습니다.

따라서 비동기 적으로 호출 가능한 방법에 대한 합리적인 구현은 완전히 구현 된 IASyncresult를 실제로 제공해야합니다.

BTW, 당신은 종종 iasyncresult를 직접 구현할 필요가 없으며, delegate.begininvoke가 반환 한 것을 반환합니다. 예를 들어 System.io.stream.beginread의 구현을 참조하십시오.

다른 팁

몇 가지 질문이있는 것 같습니다. 개별적으로 처리합시다

waithandle을 게으르게 만들었습니다

예, 이것은 가장 올바른 접근법입니다. 스레드 안전 방식 으로이 작업을 수행해야하지만 게으른 방법입니다.

트릭은 와이 란들을 처분하는 것입니다. Waithandle은 idisposable의 기초입니다 ~ 해야 하다 적시에 배치됩니다. iasycresult에 대한 문서는이 사례를 다루지 않습니다. 이를 수행하는 가장 좋은 방법은 Endinvoke입니다. BeginInvoke에 대한 문서는 모든 beginvoke에 대해 해당 EndinVoke (또는 beginread/endread)가 있어야한다고 명시 적으로 명시되어 있습니다. 이곳은 Waithandle을 처분하기 가장 좋은 곳입니다.

Asyncstate는 어떻게 구현되어야합니까?

Iasyncresult를 반환하는 표준 BCL API를 보면 대부분 상태 매개 변수를 사용합니다. 이것은 일반적으로 AsyncState에서 반환되는 값입니다 (예를 들어 소켓 API 참조). IASyncresult를 반환하는 API 시작 스타일 API의 객체로 입력 한 상태 변수를 포함시키는 것이 좋습니다. 필요하지 않지만 좋은 연습.

상태 변수의 부적에서 반환 널이 허용됩니다.

ISCompleted API

이는 IASyncresult를 생성하는 구현에 크게 의존 할 것입니다. 그러나 그렇습니다. 구현해야합니다.

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