我如何继续从ReadAsync读取数据后,我开始处理数据

本文关键字:数据 读取 处理 开始 ReadAsync 何继续 继续 | 更新日期: 2023-09-27 18:16:06

我是新来的,绝不是c#编程专家。

我正在写一个通过TCP连接到设备的应用程序。它向设备发送命令,设备响应。有时设备会在响应我的命令后发送另一条消息。例如,如果我说"读取标签",它将以标签值"Tag: abcdefg"响应。但有时,在几百毫秒之后,它会以"Buffer Low: 14"这样的内容来响应,告诉我它的缓冲区大小。

下面是我当前接收数据的方式:

            public Task<string> ReceiveDataAsync()
    {
        receiveBuffer = new byte[receiveBufferSize];
        Task<int> streamTask = _networkstream.ReadAsync(receiveBuffer, 0, receiveBufferSize);
        // Since the read is async and data arrival is unknown, the event
        // must sit around until there is something to be raised.
        var resultTask = streamTask.ContinueWith<String>(antecedent =>
        {
            Array.Resize(ref receiveBuffer, streamTask.Result);  // resize the result to the size of the data that was returned
            var result = Encoding.ASCII.GetString(receiveBuffer);
            OnDataReceived(new TCPEventArgs(result));
            return result;
        });
        return resultTask;
    }

我对阅读网络流感到困惑。当我使用ReadAsync方法,然后我得到一些东西,我如何处理延迟?在我的脑海中,我得到标记数据的第一个响应,然后开始处理该任务。即使我在努力完成任务。"我的流将继续接收数据吗?任务是否会自动返回并处理流中的更多数据?我是否需要调用ReceiveDataAsync方法,每次我认为一些数据应该到达,或者它将保持开放,直到处置流?

我如何继续从ReadAsync读取数据后,我开始处理数据

是的,你需要反复调用ReceiveDataAsync,通常在ContinueWith的回调中调用它,或者如果你使用async/await,就把它放在一个循环中,这样你就可以读取一些数据,处理它,然后回去读取(或等待)下一个字节。

:

private static void OnContinuationAction(Task<string> text)
{
    Console.WriteLine(text);
    ReceiveDataAsync().ContinueWith(OnContinuationAction);
}
...
ReceiveDataAsync().ContinueWith(OnContinuationAction);

async/await:

private async void ReceiveDataContinuously()
{
    while(true)
    {
        var text = await ReceiveDataAsync();
        Console.WriteLine(text);
    }
}

如果你不重复调用流上的ReadAsync,只要底层TCP连接是打开的,它将继续接收数据到缓冲区,但是你的程序不能得到它们。