如何'等待'WebClient.UploadStringAsync请求?

时间:2013-05-03 12:07:58

标签: c# asynchronous windows-phone-7 webclient

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

但是,WebClientUploadStringAsync方法不返回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项目。

1 个答案:

答案 0 :(得分:8)

您需要使用UploadStringTaskAsync,它会返回Task<string>

4.5之前WebClient方法的异步后缀很不幸,因为它们与您期望的TAP签名不匹配。通常,在这种情况下,建议API设计人员使用TaskAsync而不是Async作为后缀 - 这正是WebClient所做的...因此DownloadStringTaskAsync等。

您可能还想考虑使用HttpClient而不是WebClient