【问题标题】:Getting download progress / currently downloaded bytes from an async GET with C# Httpclient使用 C# Httpclient 从异步 GET 获取下载进度/当前下载的字节
【发布时间】:2014-11-21 20:46:46
【问题描述】:

我正在尝试使用 System.Web.Http 的 httpclient 在 Xamarin 中获取一些下载进度。我理解在典型情况下通过 HEAD 请求提前获取文件大小并检查相关文件的内容长度。我不明白的是如何获取当前传输的文件大小,以便我可以将其与总数进行比较。

这可能吗?我四处寻找其他示例,但他们似乎正在使用 WebClient 或其他类似的替代。

编辑:

submitButton.Clicked += async (object sender, EventArgs e) => {
var client = new HttpClient();

var url = (Just making use of a sizable wallpaper here as example.);

var result = await client.GetStreamAsync(url);
}

如果我像上面那样等待 GetStreamAsync,那么在它完成之前我不能对流执行任何操作。如果我删除 await 并尝试使用 Task 结果,则会发生同样的事情 - 即使尝试获取 Length 也无法工作,直到整个事情完成为止。

显然,如果我可以在写入流时获取它,我可以检查长度(希望如此)并将其与标题信息进行比较。但是如何访问那个中转,我不明白。

【问题讨论】:

  • 您可以使用 HttpClient 的 GetStreamAsync 异步方法并使用该流读取您的块。
  • 但是你将如何实现呢?否则我会遇到与任何其他等待异步操作相同的问题,在它完成之前我什么都做不到(除非我自己编写方法并让它更新自身之外的东西。)
  • Joseph,当您在循环中读取流时,您知道您读取了多少字节。那么做这样的事情有什么困难:while(...){ total+=stream.Read(...); }
  • 可能没什么,我的印象是等待的异步流不会让我访问流本身,只是 Task 在任务完成之前流不可用。我会尝试你的建议。
  • 不,我目前无法完成这项工作。因此,如果有人知道一个简单的工作示例,我将不胜感激。

标签: c# asynchronous xamarin httpclient


【解决方案1】:

不幸的是,到目前为止,我能找到的最佳解决方案是“使用 Webclient 而不是 httpclient”。我还没有在 Xamarin 中给 Webclient 一个机会,希望它可以在那里工作,但我设法以一种简单的方式在 PC 上使用它取得了进展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多