因为我无法找到任何方法来查看数据(读取数据而不消耗缓冲区),正如我在How to peek StreamSocket for data in UWP apps所要求的那样,我现在正在尝试制作自己的" peek&# 34;但仍然没有运气。
我不知道如何以一种让我使用超时的方式从StreamSocket读取数据,并在超时时间内保持连接可用。
最后,问题如下。在我的,比方说,IMAP客户端,我从服务器得到响应,如果这个响应是否定的,我需要稍等一下,看看服务器是否立即发送另一个响应(有时,服务器可以做到,有关错误的额外细节甚至零数据包来关闭连接)。如果服务器没有发送另一个响应,我很好,只需离开方法并返回给调用者。然后,呼叫者可以向流发送更多数据,接收更多响应等。
因此,在发送请求并获得初始响应之后,在某些情况下我需要以非常小的超时间隔再次读取套接字,如果没有数据到达,则不执行任何操作。
答案 0 :(得分:2)
您可以使用CancelationTokenSource
生成超时并停止async
操作。
DataReader
使用StreamSocket
输入流中的数据。当至少有一个字节的数据时,它的LoadAsync()
方法将返回。在这里,我们添加了一个取消源,它将在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
会关闭流和连接。