async 模式似乎是调用异步,然后在 await
结果之后让出控制权,这很有意义。
但是 WebClient
类 UploadStringAsync
方法不返回 Task
,而是返回 void,因此不能 await
编辑。相反,可以定义一个事件处理程序。例如
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 请求来快速发出嘎嘎声。
有没有一种方法可以让 yield 流回到 FlushQueue
之外,直到执行事件处理程序回调?
编辑:这是针对 Windows Phone 7.5 项目的。
最佳答案
您需要使用 UploadStringTaskAsync
,它返回一个 Task<string>
.
pre-4.5 上的异步后缀 WebClient
方法很不幸,因为它们与您期望的 TAP 签名不匹配。通常,在这种情况下,建议 API 设计人员使用 TaskAsync
而不是 Async
作为后缀 - 这正是 WebClient
没有...因此DownloadStringTaskAsync
等等
您可能还想考虑使用 HttpClient
而不是 WebClient
.
关于c# - 如何 'await' WebClient.UploadStringAsync 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16358590/