다음 시나리오가 있습니다. 하트 비트 및 기타 개체와 같은 푸시 알림을받는 TCP 클라이언트를 실행하고 있습니다. GetWeather 정보 또는 이와 유사한 것과 같은 서버에 대해 명령을 실행할 수도 있습니다. 나는 물건을받을 때마다 꽤 잘 작동하는 이벤트를 발생시킵니다. 하지만 이제는 서버에서 일부 데이터를 요청하고 서버가 올바른 개체에 응답 할 때까지 기다릴 수 있기를 원합니다. 개체를 요청하는 동안 다른 개체도 나에게 보낼 수 있습니다.
다음은 의사 코드입니다.
대신에:
TcpServer.ObjectReceived += ObjectReceivedMethod;
TcpServer.GetWeather();
public void ObjectReceived(object data)
{
}
내가 원하는:
var result = await TcpServer.GetWeather();
ObjectReceived에서 대기 메서드로 날씨 정보를 전송하려면 어떻게해야합니까?
KR 마누엘
TaskCompletionSource<T>
다음과 같은 을 사용하고 싶습니다.
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를 사용하여 요청을 응답과 연결한다고 가정합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다