2
我花了很多時間試圖弄清楚這一點,但不幸的是無濟於事。我會很感激任何幫助。即使使用ConfigureAwait(false),HttpClient的PostAsync方法塊也會被使用
問題是PostAsync
呼叫阻塞事件,雖然我使用await
和ConfigureAwait(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);
}
}
順便說一句,謝謝你的偉大的文章斯蒂芬。他們幫助很多。
你使用的是WPF,UWP窗體嗎? – Flaugzig
你是什麼意思的「塊」?這是一個僵局,還是隻是暫停一秒左右?此外,這是在.NET桌面上? –
*我對「火與忘」不感興趣。我需要確保在允許進一步執行之前發送數據*:聽起來像你一樣***要***想阻止它。所以有什麼問題?換句話說,在發送數據之前,您不希望應用程序啓動(因爲這是您的方法)。 – sstan