2016-05-27 24 views
2

我花了很多時間試圖弄清楚這一點,但不幸的是無濟於事。我會很感激任何幫助。即使使用ConfigureAwait(false),HttpClient的PostAsync方法塊也會被使用

問題是PostAsync呼叫阻塞事件,雖然我使用awaitConfigureAwait(false)。下面的處理程序被稱爲UI線程上:

private async void OnApplicationLaunching(object sender, LaunchingEventArgs e) 
{ 
    using (var httpClient = new HttpClient()) 
    { 
     var content = new List<KeyValuePair<string, string>>(); 

     var urlEncodedContent = new FormUrlEncodedContent(content); 

     await httpClient.PostAsync("url address", urlEncodedContent).ConfigureAwait(false); 
    } 
} 

編輯1

  • 我用的WindowsPhone 8.0 Silverlight的
  • 在我看來,這是一個僵局。執行被阻止,直到出現異常並顯示「任務已取消」消息
  • 我對「消防和忘記」不感興趣。我需要確保在允許進一步執行之前發送數據。

編輯2

下面是另一個代碼示例不很多,從以前的一個不同,但尤爲明顯,從斯蒂芬的博客類似於代碼示例

http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

「防止死鎖」

章節「避免上下文」http://blog.stephencleary.com/2012/02/async-and-await.html

private async void OnApplicationLaunching(object sender, LaunchingEventArgs e) 
{ 
    await this.SendSth(); 

    // here I want to know for sure that data has already been sent 
} 

private async Task SendSth() 
{ 
    using (var httpClient = new HttpClient()) 
    { 
     var content = new List<KeyValuePair<string, string>>(); 

     var urlEncodedContent = new FormUrlEncodedContent(content); 

     await httpClient.PostAsync("some url", urlEncodedContent).ConfigureAwait(false); 
    } 
} 

順便說一句,謝謝你的偉大的文章斯蒂芬。他們幫助很多。

+0

你使用的是WPF,UWP窗體嗎? – Flaugzig

+0

你是什麼意思的「塊」?這是一個僵局,還是隻是暫停一秒左右?此外,這是在.NET桌面上? –

+0

*我對「火與忘」不感興趣。我需要確保在允許進一步執行之前發送數據*:聽起來像你一樣***要***想阻止它。所以有什麼問題?換句話說,在發送數據之前,您不希望應用程序啓動(因爲這是您的方法)。 – sstan

回答

0

從我對C#異步編程的理解中,應該在庫中調用ConfigureAwait

查看來自Stephen Cleary的article。還請檢查this

相關問題