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

Bre*_*dan 6 c# asynchronous webclient windows-phone-7

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

但是WebClientUploadStringAsync方法不返回a 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这不会等待响应,而是通过推出最大数量的Web请求来快速响应.

有没有办法在FlushQueue执行事件处理程序回调之前将流返回到外部?

编辑:这适用于Windows Phone 7.5项目.

Jon*_*eet 8

你需要使用UploadStringTaskAsync,它返回一个Task<string>.

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

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