c# - 从网络源下载字节数

标签 c# windows-runtime windows-phone-8.1 win-universal-app

我正在尝试在 Windows Phone 8.1 Runtime 上使用 HttpWebRequest (可以是任何不同的方式 - 我已经尝试过 WebRequest、HttpClient ...)从网络源下载多个字节 - 完整代码:

private async void Download1000_Click(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("Download Started");
    HttpWebRequest longRequest = (HttpWebRequest)WebRequest.Create(new Uri(@"http://s3.amazonaws.com/dnr/dotnetrocks_0986_enterprise_sharepoint.mp3"));
    longRequest.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString(); // prevent caching the whole file
    longRequest.AllowReadStreamBuffering = false;
    using (WebResponse myResponse = await longRequest.GetResponseAsync())
    using (Stream myStream = myResponse.GetResponseStream())
    {
        int bytesRead = 0;
        byte[] myBuffer = new byte[1000];
        Stopwatch newWatch = new Stopwatch();
        newWatch.Start();
        while ((bytesRead = await myStream.ReadAsync(myBuffer, 0, 1000)) > 0)
            Debug.WriteLine(bytesRead.ToString() + " bytes read. Elapsed time: " + newWatch.Elapsed.TotalSeconds.ToString("0.000000") + " seconds");
    }
    Debug.WriteLine("Download Finished");
}

问题 - 代码正在工作,但操作系统以某种方式阻止读取少量字节(即使我已禁用 AllowReadStreamBuffering) - 似乎它下载了整个文件到某个缓存(?),然后运行 ​​while 循环。它看起来像这样:

withSomeCache

如您所见 - 第一个字节数在 22 秒后出现 - 文件已全部下载。相反,当我在 Windows Phone 8.1 Silverligh 上构建相同的代码(复制粘贴)并在同一设备上运行时 - 它会按预期运行:

withoutCache

是否有任何方法可以在 WP8.1 Runtime 上下载字节数,而无需先下载整个文件?

最佳答案

这是最后的办法——使用套接字!我知道这很不酷。

如果您需要的不是 super 复杂,您可以使用这两个进行混合:.NET Http socket libraryTcpClient for WP 。我最近需要这个用于 Windows Phone 8.0 应用程序,因此我使用了这些库并且它工作正常。

编辑 - 演示项目

这是一个demo project这就是我刚才建议的。这不是什么史诗般的事情,但似乎确实有效。如果您不需要太复杂的东西,它应该可以正常工作。

题外话 - 为什么我需要套接字

最近我遇到了 http 请求的所有其他可用选项的问题 - 它们都需要 UI 线程空闲才能工作(至少在 Windows Phone 中,不确定 WinRT)。也就是说,即使您从另一个线程使用它们,它们实际上也会在 UI 线程中执行某些操作。这通常很好......除了在我的情况下,我真的需要阻止 UI 线程。

关于c# - 从网络源下载字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23821821/

相关文章:

有关在粒度级别上处理文件的 C# 入门知识或示例

c# - 如何控制 MVVM WinRT/XAML Windows Store 应用程序中 ListView 的滚动位置?

c# - 获取 MusicLibrary 时 Windows Phone 8.1 应用商店应用程序出错(调用 COM 组件已返回错误 HRESULT E_FAIL)

c# - 即使已添加转换器,也不会调用 Windows Phone 8.1 图像分辨率转换器

c# - 如何在 temp 以外的目录中创建临时文件?

c# - 如何覆盖 userControl 属性

c# - 使用 Facebook API 获取拥有 "liked"你的用户

javascript - 在 Windows 8 Metro HTML5 应用程序中调整图像大小同时保持其质量?

javascript - 如何测试我的应用程序漫游设置

c# - Windows Phone 8.1/Windows 8.1如何设置http客户端请求操作超时