2

インターフェイスが次のような API があります。

void SendRequest(Guid id, IRequest request);
event EventHandler<ResponseEventArgs> ResponseReceived;

この方法を実装する最良の方法は何ですか?

Task<T> GetResponse(IRequest request) where T: IRequest

複数のリクエストが互いに重複する可能性があることに注意してください。そのため、レスポンスが戻ってきたら、親リクエストを検索する必要があります。TaskCompletionSource が役立つ可能性があると感じていますが、完全につなぎ合わせることができません。

4

2 に答える 2

0

イベントが戻るのを待つタスクを返すことができます。

Task<T> GetResponse<T>() 
{
    T result = default(T);
    ManualResetEvent ev = new ManualResetEvent(false);
    ResponseReceived += (s,e) =>  {     
        result = default(T); /* result = e.Xxx */
        ev.Set();
    };
    return new Task<T>(() => {
        SendRequest(Guid.NewGuid());        
        ev.WaitOne();
        return result;
    });
}
于 2012-07-11T18:36:57.713 に答える