gpt4 book ai didi

c# - 异步/等待事件

转载 作者:太空宇宙 更新时间:2023-11-03 23:02:03 25 4
gpt4 key购买 nike

我有以下场景。我正在运行一个 tcp 客户端,我可以在其中接收心跳和其他对象等推送通知。我还可以对服务器运行命令,如 GetWeather 信息或类似的东西。每次我收到object 我提出了一个效果很好的事件。但是现在我希望能够在服务器上请求一些数据并等待它直到服务器响应正确的对象。在请求一个对象的过程中,其他对象也可以发送给我。

这是一些伪代码:

代替:

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 将请求与响应相关联。

关于c# - 异步/等待事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42767328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com