我是新来的,绝不是c#编程的专家。
我正在编写一个通过TCP连接到设备的应用程序。它向设备发送命令,设备响应。有时设备在响应我的命令后会发送另一条消息。例如,如果我说" Read 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方法,然后我得到回报,我该如何处理延迟?在我看来,我得到了标签数据的第一个响应,然后我开始处理该任务。即使我在完成任务&#34;。继续使用&#34;我的信息流会继续接收数据吗?该任务是否会自动返回并处理流中的更多数据?每次我认为某些数据应该到达时是否需要调用ReceiveDataAsync方法,或者在Dispose of stream之前它是否保持打开状态?
答案 0 :(得分:2)
是的,您需要反复拨打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连接打开,它就会继续将数据接收到缓冲区,但你的程序无法获取它们。