2017-03-13 25 views
1

以下のシナリオがあります。私はハートビートや他のオブジェクトのようなプッシュ通知を取得するtcpクライアントを実行しています。私はGetWeatherの情報やそのようなもののようなサーバーに対してコマンドを実行することもできます。私が オブジェクトを受け取るたびに、私はかなりうまく動作するイベントを発生させます。 しかし、今私は、サーバー上のいくつかのデータを要求し、サーバーが正しいオブジェクトに応答するまでそれを待つことができるようにしたい。オブジェクトの要求中に、他のオブジェクトを私に送ることもできます。ここで非同期/待機イベント

は、いくつかの擬似コードです:

の代わりに:

TcpServer.ObjectReceived += ObjectReceivedMethod; 
TcpServer.GetWeather(); 
public void ObjectReceived(object data) 
{ 

} 

私がしたい:

var result = await TcpServer.GetWeather(); 

は、どのように私は待っている方法にObjectReceivedから天気情報を転送することができますか?あなたはTaskCompletionSource<T>を使用したい

KRマヌエル

答えて

3

は、このような何か:

private Dictionary<Guid, TaskCompletionSource<WeatherResponse>> _weatherRequests; 

public Task<WeatherResponse> GetWeatherAsync() 
{ 
    var messageId = Guid.NewGuid(); 
    var tcs = new TaskCompletionSource<WeatherResponse>(); 
    _weatherRequests.Add(messageId, tcs); 
    _server.SendWeatherRequest(messageId); 
    return tcs.Task; 
} 

public void ObjectReceived(object data) 
{ 
    ... 
    if (data is ServerWeatherResponse) 
    { 
    var tcs = _weatherRequests[data.requestId]; 
    _weatherRequests.Remove(data.requestId); 
    tcs.SetResult(new WeatherResponse(data)); 
    } 
} 

これは、サーバーがGUID IDを使用して応答と要求を関連付けることを想定しています。

関連する問題