2013-05-03 61 views
5

異步模式似乎被稱爲異步,然後在產生控制後產生控制,這很有意義。如何'等待'WebClient.UploadStringAsync請求?

WebClientUploadStringAsync方法不返回Task,而是它返回void,所以不能await ed。相反,可以定義一個事件處理程序。例如

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設計人員使用的TaskAsync代替Async作爲後綴 - 這正是WebClient沒有...因此DownloadStringTaskAsync

您可能還需要考慮使用的HttpClient代替WebClient

+0

感謝,很棒,查看'UploadStringTaskAsyc'的文檔,它以字符串形式返回'服務器響應',但沒有說明字符串的格式是什麼 - 我需要HTTP repsonse代碼。 200,我是否需要解析該字符串? – Brendan 2013-05-03 12:20:26

+0

也是HttpClient現在做這種事情的首選方式?這是我聽說過的第一個...在Windows Phone上搜索'POST數據'導致WebClient,HttpWebRequest和其他人,但不是HttpClient,例如[此MSDN文章](http://msdn.microsoft.com/en-us/library/ff637320(v = vs.95).aspx#不支持)和[本MSDN文章](http://msdn.microsoft.com/zh-cn/ COM/EN-US /庫/ debx8sh9(v = VS.90)的.aspx)。是否有一個很好的資源來找出當前最好的被接受的做法? – Brendan 2013-05-03 12:25:41

+0

據我所知,Windows Phone上的'HttpClient'可作爲NuGet包使用,但仍處於測試版。所以我不會把它稱爲「首選方式」,但「首選的方式是」;)更多信息:http://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable-httpclient -for-net-framework-and-windows-phone.aspx – 2013-05-03 12:54:52