- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 WPF 中使用进度条运行异步上传(最好也使用 PCL 在 Xamarin 和 SL 中重用代码。)
我一直在尝试使用 System.Net.HttpClient。
不幸的是,PutAsync 不提供任何进度通知。 (我知道它适用于 Windows.Web.Http.HttpClient,但这不适用于 WPF,也不适用于 PCL)。
对于下载,实现自己的进度条相当容易,如 here 所述。 .您只需传递 ResponseHeadersRead 选项,该选项会在返回 header 后立即使流可用,然后您可以逐块读取它,并在进行时增加进度条。但是对于上传,这种技术不起作用 - 您需要一次性将所有上传数据传递到 PutAsync,因此没有机会增加您的计数器。
我也想知道使用 HttpClient.SendAsync 代替。我希望我可以把它当作一个异步 HttpWebRequest (在其中你可以在写入 HttpWebRequest.GetRequestStream 时增加计数器,如 here 所述)。但不幸的是 HttpClient.SendAsync 没有给你可写的流,所以这是行不通的。
那么 HttpClient 是否支持带有非阻塞 UI 和进度条的上传?这似乎是一种适度的需求。或者我应该使用另一个类吗?非常感谢。
最佳答案
假设 HttpClient
(和底层网络堆栈)没有缓冲您应该能够通过覆盖 HttpContent.SerializeToStreamAsync
来做到这一点.您可以执行以下操作:
const int chunkSize = 4096;
readonly byte[] bytes;
readonly Action<double> progress;
protected override async Task SerializeToStreamAsync(System.IO.Stream stream, System.Net.TransportContext context)
{
for (int i = 0; i < this.bytes.Length; i += chunkSize)
{
await stream.WriteAsync(this.bytes, i, Math.Min(chunkSize, this.bytes.Length - i));
this.progress(100.0 * i / this.bytes.Length);
}
}
HttpClient
缓冲您要么需要提供内容长度(例如:实现
HttpContent.TryComputeLength
,或设置标题)或启用
HttpRequestHeaders.TransferEncodingChunked
.这是必要的,否则
HttpClient
无法确定内容长度 header ,因此它首先将整个内容读入内存。
AllowAutoRedirect
因为 WP8 在处理重定向帖子的方式上有一个错误(解决方法是先发出 HEAD,获取重定向的 URL,然后使用
AllowAutoRedirect = false
将帖子发送到最终 URL)。
关于wpf - HttpClient 上传进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21130362/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!