2013-05-03 26 views
5

非同期パターンは非同期と呼ばれるように見えますが、結果はawaitの後に出力され、多くの意味があります。WebClient.UploadStringAsyncリクエストを '待つ'方法

WebClientクラスUploadStringAsyncメソッドでは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プロジェクト用です。

答えて

7

UploadStringTaskAsyncを使用する必要があります。Task<string>を返します。

4.5より前のWebClientメソッドの非同期のサフィックスは、期待するTAPシグネチャと一致しないため、残念です。一般的に、そのような状況ではAPIの設計者が接尾辞として代わりにAsyncTaskAsyncを使用することをお勧めします - WebClientはまったく同じものです...したがってDownloadStringTaskAsyncなど

またHttpClient代わりのWebClientを使用して検討する必要があります。

+0

「UploadStringTaskAsyc」のドキュメントを見て、文字列として「サーバレスポンス」を返しますが、文字列の形式は何もわかりません - HTTPのrepsonseコードが必要です。 200、その文字列を解析する必要がありますか? – Brendan

+0

また、HttpClientはこのようなことを行うための好ましい方法ですか?これは私が聞いた最初のものです... 'Windows PhoneからのPOSTデータ'を検索するとWebClient、HttpWebRequestなどが発生しますが、HttpClientは発生しません。 [このMSDNの記事](http://msdn.microsoft.com/en-us/library/ff637320(v=v2/95).aspx#未サポート)および[このMSDNの記事](http://msdn.microsoft。 com/ja-us/library/debx8sh9(v = 90).aspx)。現在受け入れられているベストプラクティスを見つけるための優れたリソースはありますか? – Brendan

+0

私が知る限り、Windows Phone上の 'HttpClient'はNuGetパッケージとして利用可能ですが、まだベータ版です。だから私はそれを「優先する方法」と呼ぶのではなく、「優先する方法」と呼んでいます;)詳細については、http://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable-httpclientを参照してください。 -for-net-framework-and-windows-phone.aspx –

関連する問題