异步/等待发送和接收网络数据

时间:2015-03-24 02:40:42

标签: c# multithreading sockets asynchronous async-await

我试图使用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
}

我认为我做错了。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:-1)

我找到了合适的解决方案。

我可以使用所谓的ManualResetEvent,而不是使用TaskCompletionSource<T>。这为我提供了允许线程池等待某些状态更改所需的功能。