【发布时间】: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