2016-10-13 2 views
2

Я работаю над созданием одного из наших приложений async, и теперь мой HttpClient отключается (я получаю TaskCanceledException), когда я вызываю SendAsync. Вот код, который таймаут:Может ли событие TaskCanceledException означать «Тупик»?

  response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead) 
       .ConfigureAwait(false); 

Из того, что я понимаю, ConfigureAwait(false) означает, что я не могу тупиковой эту задачу. Я жду этого полностью (или вниз) стека.

Когда я делаю тот же запрос в почтальоне, он занимает секунду. Тайм-аут для моего HttpClient составляет 2 минуты. Может ли быть что-то еще?

Кроме того, поскольку я получаю TaskCanceledException, значит ли это, что мои Задачи не зашли в тупик?

Update

Спасибо за ответ @Servy, мне удалось обойти мою проблему, изменив приведенный выше код:

  response = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead) 
       .ConfigureAwait(false).GetAwaiter().GetResult(); 

Так что, если я не жду его, все работает правильно. Означает ли это, что это, скорее всего, тупик?

ответ

3

Из того, что я понимаю, ConfigureAwait(false) означает, что я не могу затормозить эту задачу.

Это неправда. Вы оказываетесь в тупике, когда вы синхронно ожидаете в контексте синхронизации в асинхронной операции, которая пытается выполнить продолжение в том же контексте синхронизации. То, что этот продолжение не пытается использовать контекст синхронизации, не означает, что в другом месте нет другого продолжения. Поэтому, хотя мы знаем, что этот await - это не то, что вызывает тупик, это не значит, что его нет.

Я жду этого полностью (или вниз) стека.

Если это верно, и нет ничего синхронно блокирует контекст синхронизации, то что означать, что вы не зашли в тупик код. (Или, по крайней мере, не этот общий источник тупика.)

Когда я делаю тот же запрос в почтальоне, он занимает секунду. Тайм-аут для моего HttpClient составляет 2 минуты. Может ли быть что-то еще?

Несомненно. Брандмауэр может мешаться, ваш сетевой шнур мог быть отключен, другой сайт может быть отключен или намеренно игнорирует ваши запросы по какой-то причине.

Кроме того, поскольку я получаю исключение TaskCanceledException, это означает, что мои задачи не зашли в тупик?

Это действительно не говорит вам ни о в.Если конкретная операция, которая пытается запланировать продолжение в заблокированном контексте синхронизации, также имеет маркер отмены, который приводит к тому, что время истекает через некоторое время, тогда он блокируется до тех пор, пока он не будет отменен. Но есть, конечно, любое количество вещей, которые могут привести к тому, что Task будет отменен без взаимоблокировки.

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