2016-05-27 5 views
2

Я потратил много часов, пытаясь понять это, но, к сожалению, безрезультатно. Я был бы благодарен за любую помощь.Блоки метода PostAsync HttpClient, хотя используется ConfigureAwait (false)

Проблема в том, что событие блокировки PostAsync, хотя я использую await и ConfigureAwait(false). Ниже обработчик вызываются в потоке пользовательского интерфейса:

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); 
    } 
} 

Edit 1

  • Я использую WindowsPhone 8.0 Silverlight
  • На моем взгляде, это тупиковое. Выполнение блокируется до тех пор, пока не появится сообщение об исключении «задача была отменена»
  • Меня не интересует «огонь и забыть». Я должен быть уверен, что данные отправляются до разрешения дальнейшего выполнения.

Edit 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 следует вызывать в библиотеке.

См. Это article от Stephen Cleary. Также проверьте this.

Смежные вопросы