我如何继续从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方法,每次我认为一些数据应该到达,或者它将保持开放,直到处置流?
是的,你需要反复调用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连接是打开的,它将继续接收数据到缓冲区,但是你的程序不能得到它们。