我花了很多时间试图弄清楚这一点,但不幸的是没有结果。我将不胜感激。
问题是,尽管我使用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
这是另一个代码示例,与以前的代码示例没有很大不同,但更像是Stephen博客中的代码示例。
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);
}
}
顺便说一句,感谢斯蒂芬的出色文章。他们有很多帮助。
最佳答案
根据我对C#中异步编程的理解,应该在库中调用ConfigureAwait
。
请参见Stephen Cleary的article。还要检查this。
关于c# - 即使使用ConfigureAwait(false),HttpClient的PostAsync方法也会阻塞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37483195/