WinRT 从无限联机流读取挂起

本文关键字:读取 挂起 联机 无限 WinRT | 更新日期: 2023-09-27 18:37:00

以下代码从 URI 获取流,并使用循环以块为单位读入。请注意,指定的 URI 后面是在线无线电流,这意味着没有已知大小。

var uri = new Uri("http://*******", UriKind.Absolute); 
var http = new HttpClient();
var stream = await http.GetStreamAsync(uri);
var buffer = new byte[65536];
while (true)
{
    var read = await stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
    Debug.WriteLine("Read: {0}", read);
}

现在,虽然这在 .NET 4.5 控制台应用中工作得很好,但完全相同的代码在 WinRT 中无法按预期工作 - 它将读取第一个块,并且当第二次调用 ReadAsync 时,它只会卡住并且永远不会继续。

如果我将 URI 切换到文件(已知大小),则两个项目中一切正常。

有什么提示吗?

编辑>请注意,此行为仅在WP8.1上发生。我刚刚在SO上搜索了更多内容,发现我的问题可能是这个问题的副本: WP8.1 HttpClient Stream仅获得65536字节的数据 如果这是真的,我将关闭我的问题

WinRT 从无限联机流读取挂起

HttpClient.GetAsync()HttpCompletionOption.ResponseHeadersRead一起使用。当收到标头时返回,然后执行HttpResponse.Content.ReadAsInputStreamAsync()

看起来你的 while 循环是无限的。你如何确保它是有限的?而不是 while(true) 让它像这样

var uri = new Uri("http://*******", UriKind.Absolute);
var http = new HttpClient();
var stream = http.GetStreamAsync(uri).Result;
using (var reader = new StreamReader(stream))
{
     while (!reader.EndOfStream)
     {
         var response = reader.ReadToEnd();
     }
}