6

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

但是,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);
    }
}

但是,这不会等待响应,而是会通过发起最大数量的 Web 请求而迅速崩溃。

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

编辑:这是一个 Windows Phone 7.5 项目。

4

1 回答 1

8

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

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

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

于 2013-05-03T12:09:13.143 回答