异步模式似乎是异步调用,然后在await
结果之后产生控制,这很有意义。
但是,WebClient
类UploadStringAsync
方法不返回Task
,而是返回void,因此无法await
编辑。而是可以定义事件处理程序。 e.g。
public async Task FlushQueue() {
attempt = 0;
WebClient wc = new WebClient();
while ((queue.Count > 0) && (attempt < ALLOWED_ATTEMPTS)) {
// Copy 10 items from queue and put into buffer ...
...
wc.UploadStringCompleted += (s, e) => {
// if response 200
// Remove 10 sent items from queue
// else attempt++
};
wc.UploadStringAsync("http://example.com/blah", "POST", buffer);
// In an ideal world we could call UploadStringAsync like,
// var response = await wc.UploadStringAsync("http://example.com/blah", "POST", buffer);
}
}
然而,这并没有等待响应,而是通过推出最大数量的Web请求来快速响应。
在执行事件处理程序回调之前,有没有办法让流回到FlushQueue
之外?
编辑:这适用于Windows Phone 7.5项目。
答案 0 :(得分:8)
您需要使用UploadStringTaskAsync
,它会返回Task<string>
。
4.5之前WebClient
方法的异步后缀很不幸,因为它们与您期望的TAP签名不匹配。通常,在这种情况下,建议API设计人员使用TaskAsync
而不是Async
作为后缀 - 这正是WebClient
所做的...因此DownloadStringTaskAsync
等。
您可能还想考虑使用HttpClient
而不是WebClient
。