Я потратил много часов, пытаясь понять это, но, к сожалению, безрезультатно. Я был бы благодарен за любую помощь.Блоки метода 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);
}
}
Кстати, спасибо Стивен за ваши прекрасные статьи. Они помогают много.
Вы используете формы окон WPF, UWP? – Flaugzig
Что именно вы подразумеваете под «блоками»? Это тупик, или он просто приостанавливается на секунду или около того? Кроме того, это на рабочем столе .NET? –
* Меня не интересует «огонь и забыть». Я должен быть уверен, что данные отправляются, прежде чем разрешить дальнейшее выполнение *: Звучит для меня, как вы *** *** хочу, чтобы он блокировался. Так в чем проблема? Или, другими словами, вы не хотите, чтобы приложение запускалось (потому что это ваш метод для), пока данные не будут отправлены. – sstan