Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待网络流信号发送数据_C#_Sockets_Async Await - Fatal编程技术网

C# 等待网络流信号发送数据

C# 等待网络流信号发送数据,c#,sockets,async-await,C#,Sockets,Async Await,我正在尝试解决如何在等待Networkstream readasync时向其发出等待writeAsync的信号。我不确定从stream.readasync方法返回的机制,如下所示。我想出了一种方法来通知要完成的任务,这将允许写入流。这个代码的方法似乎是错误的。有更好的方法吗 async Task SocketStuff(TcpListener listener) { TcpClient client = await listener.AcceptTcpClient

我正在尝试解决如何在等待Networkstream readasync时向其发出等待writeAsync的信号。我不确定从stream.readasync方法返回的机制,如下所示。我想出了一种方法来通知要完成的任务,这将允许写入流。这个代码的方法似乎是错误的。有更好的方法吗

    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

为什么不直接从发现数据可用的代码中发送数据呢?发送和接收可以同时进行。