我试图使用async / await模式将数据的发送和接收结束。我创建的是一个事件驱动的套接字框架,只要从服务器收到数据就会触发事件。但是,在发送之后,我无法弄清楚如何等待线程,因此在服务器返回数据之前我不会返回。
过去我使用手动重置事件来实现这个目标......
byte[] returnData;
public byte[] SendData(byte[] data){
socket.Send(data, 0, data.Length);
manualResetEvent.Wait();
return returnData;
}
public void OnDataReceived(byte[] serverData){
returnData = serverData;
manualResetEvent.Set();
}
此方法只是暂停调用者线程,直到触发重置事件。这不好,因为我想要async / await模式,以便调用线程在等待来自服务器的数据时可以自由地做其他工作。
我现在拥有的是......
byte[] returnData;
public async Task<byte[]> SendData(byte[] data){
await socket.SendAsync(data, 0, data.Length);
//await something that frees up this thread to do other work
return returnData;
}
public void OnDataReceived(byte[] serverData){
returnData = serverData;
//do something that pushes SendData back into the active context
}
我认为我做错了。任何帮助将不胜感激!
答案 0 :(得分:-1)
我找到了合适的解决方案。
我可以使用所谓的ManualResetEvent
,而不是使用TaskCompletionSource<T>
。这为我提供了允许线程池等待某些状态更改所需的功能。