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

时间:2014-08-03 16:06:32

标签: c# networkstream

我是新来的,绝不是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之前它是否保持打开状态?

1 个答案:

答案 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连接打开,它就会继续将数据接收到缓冲区,但你的程序无法获取它们。