6

非同期パターンは、非同期を呼び出し、await結果を取得した後にコントロールを生成するように見えます。これは非常に理にかなっています。

ただし、WebClientクラスUploadStringAsyncメソッドは a を返さず、代わりに void を返すため、 edTaskできません。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 より前のメソッドの async サフィックスはWebClient、予想される TAP 署名と一致しないため、残念です。一般に、そのような状況では、API 設計者はサフィックスとして a のTaskAsync代わりに使用することをお勧めします。AsyncWebClientDownloadStringTaskAsync

HttpClientの代わりに使用することも検討してWebClientください。

于 2013-05-03T12:09:13.143 に答える