在 UWP StreamSocket 中,我可以读取超时数据并在超时后保持连接打开吗

In UWP StreamSocket, can I read data with timeout and leave the connection open if timeout elapses

因为我找不到任何方法来查看数据(在不消耗缓冲区的情况下读取数据),正如 How to peek StreamSocket for data in UWP apps 所要求的,我现在正在尝试自己制作 "peek" 但仍然没有运气.

我不知道如何以允许我使用超时的方式从 StreamSocket 读取数据,并在超时结束时保持连接可用。

最终问题如下。在我的 IMAP 客户端中,我从服务器得到响应,如果这个响应是否定的,我需要稍等一下,看看服务器是否立即发送另一个响应(有时,服务器可以做到,有额外的细节在错误甚至零数据包上关闭连接)。如果服务器没有发送另一个响应,我很好,只是离开方法并返回给调用者。调用方随后可以向流发送更多数据、接收更多响应等。

因此,在发送请求并获得初始响应后,在某些情况下我需要以非常小的超时间隔再次读取套接字,如果没有数据到达,则什么也不做。

您可以使用 CancelationTokenSource 生成超时并停止 async 操作。 DataReader 使用来自 StreamSocket 输入流的数据。当至少有一个字节的数据时,它的 LoadAsync() 方法将 return 。在这里,我们添加了一个取消源,如果没有数据被消耗,它将在 1 秒后取消异步任务以停止 DataReader.LoadAsync()

var stream      = new StreamSocket();

var inputStream = stream.InputStream;

var reader      = new DataReader(inputStream);
reader.InputStreamOptions   = InputStreamOptions.Partial;

while(true)
{
    try
    {
        var timeoutSource   = new CancellationTokenSource(TimeSpan.FromSeconds(1));
        var data    = await reader.LoadAsync(1).AsTask(timeoutSource.Token);

        while(reader.UnconsumedBufferLength > 0)
        {
            var read    = reader.ReadUInt32();
        }
    }
    catch(TaskCanceledException)
    {
        // timeout
    }
}

不要忘记处理 DataReader 将关闭流和连接。