c# - 如何 'await' WebClient.UploadStringAsync 请求?

标签 c# asynchronous windows-phone-7 webclient

async 模式似乎是调用异步,然后在 await 结果之后让出控制权,这很有意义。

但是 WebClientUploadStringAsync 方法不返回 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/

相关文章:

windows-phone-7 - 如何将图像发送到 php web 服务?

c# - 如何在 Windows Phone 中暂停秒表?

c# - 不变继承问题

json - 多个异步 mongo 请求生成困惑的返回

c# - 为什么 SourceUpdated 事件不触发我在 WPF 中的图像控件?

ajax - Angular JS 数据未从异步 http 请求填充

ios - 如何在iOS中干净利落地封装并依次执行一系列后台任务?

windows-phone-7 - 当我关闭模拟器时,Windows Phone 独立存储是永久的吗?

c# - 使用静态方法的充分理由?

c# - 使用 SqlCommand.ExecuteNonQuery,如何获得超过 int 限制的受影响行数?