C# 等待网络流信号发送数据
我正在尝试解决如何在等待Networkstream readasync时向其发出等待writeAsync的信号。我不确定从stream.readasync方法返回的机制,如下所示。我想出了一种方法来通知要完成的任务,这将允许写入流。这个代码的方法似乎是错误的。有更好的方法吗C# 等待网络流信号发送数据,c#,sockets,async-await,C#,Sockets,Async Await,我正在尝试解决如何在等待Networkstream readasync时向其发出等待writeAsync的信号。我不确定从stream.readasync方法返回的机制,如下所示。我想出了一种方法来通知要完成的任务,这将允许写入流。这个代码的方法似乎是错误的。有更好的方法吗 async Task SocketStuff(TcpListener listener) { TcpClient client = await listener.AcceptTcpClient
async Task SocketStuff(TcpListener listener)
{
TcpClient client = await listener.AcceptTcpClientAsync();
NetworkStream stream = client.GetStream();
var buf = new byte[2048];
var readTask = stream.ReadAsync(buf, 0, buf.Length);
var signalToSend = SignalReadyToSendAsync();
var completetedTask = await Task.WhenAny(readTask, signalToSend);
if (completetedTask == signalToSend)
{
await stream.WriteAsync(someData, 0, someData.Length);
}
if (completetedTask == readTask)
{
// .....
}
}
async Task SignalReadyToSendAsync()
{
while (nothingToSend)
{
await Task.Delay(250);
}
return;
如果您想在方法内部完全处理
流
,这是一种方法。但我建议您将整个过程封装到另一个类中,该类存储流的一个实例
,并公开一个直接将其数据写入流的函数
所以基本上你有一个方法:
Task SendData(byte[] data)
{
return stream.WriteAsync(someData, 0, someData.Length);
}
每次需要发送数据时,从外部调用此方法。包装类应将流
存储为类级变量
基本上,您使用网络流创建类,它会自动启动一个函数来接收数据并处理(或转发)数据
在一个方法中处理这一切是很棘手的,需要支持类,正如您所注意到的那样,这会使一切变得更加复杂。我认为使用一个方法很容易理解,但您只需要能够在准备发送消息时完成任务。您可以通过设置任务来完成此操作:
Task msgReadyTask = Task.Delay(Timeout.Infinite, mrtToken);
当一条消息准备好发送到该周期结束的信号时,可以取消mrtToken 为什么不直接从发现数据可用的代码中发送数据呢?发送和接收可以同时进行。