2015-10-26 2 views
5

Я узнал трудный способ вызова Task.Wait из потока пула может привести к тупиковой ситуации, связанной с потоком.Должен ли задан. Ожидать устаревания?

Согласно this MSDN article, в «тупиков» главы, мы должны подчиняться этим двум правилам:

  • Не создавать любой класс, синхронные методы ждать асинхронных функций, так как этот класс может быть вызван из резьбы на бассейн.
  • Не используйте какой-либо класс внутри асинхронной функции, если класс блокирует ожидания асинхронных функций.

Кажется, единственное место, где можно законно использовать Task.Wait - основная функция - я немного преувеличиваю здесь, но вы получаете идею.

Почему Task.Wait все еще является частью платформы .NET, видя, насколько это опасно?

ответ

5

Почему Task.Wait все еще является частью платформы .NET, видя, как это опасно?

Потому что вы хотите иметь возможность синхронно блокировать на Task. Редко, но вы все еще делаете. Как вы сказали, Main, вероятно, является самым популярным (и предпочтительно единственным) местом, где это произойдет. Это и тот факт, что Microsoft известна своей совместимостью в обратном направлении, поэтому, как только это было введено, маловероятно, что он устареет или исчезает из BCL. То же самое касается Task.WaitAll.

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


Другое дело в том, что вы не можете всегда идти асинхронной все пути. К сожалению, много раз у вас есть код, который является синхронным по сигнатуре, который нельзя изменить и ему нужно вызвать вызов метода асинхронного вызова. Да, это опасно и обескуражено всеми и считается anti-pattern with async code, и я сам ответил хотя бы на дюжину вопросов о SO, где люди в конечном итоге заходят в тупик и не понимают, почему, но авторам TPL все еще нужно было сделать этот тип возможных вызовов.

+2

Я не согласен с тем, что люди не правильно читают документацию в этом конкретном случае. Подавляющее большинство документации вводит в заблуждение и заставляет людей думать, что нет ничего плохого в вызове Task.Wait, Task.Result или слишком многих других способов стрелять в собственную ногу. – ZunTzu

+0

@ZunTzu По документации я имею в виду не только MSDN. Просто googling 'Task.Wait' [вызывает совпадения] (http://stackoverflow.com/questions/13140523/await-vs-task-wait-deadlock), которые явно говорят вам не блокировать асинхронный код. Более того, изучение ожиданий async требует эксперимента и чтения, и есть много сообщений в блоге, описывающих эти сценарии тупиковой ситуации. Пользователь несет ответственность за то, что он использует и как он должен использоваться. Я * согласен *, что в документах MSDN отсутствует достаточная информация об опасной синхронной блокировке на асинхронных операциях. –

+0

Документация должна быть более явной в отношении опасностей, например, так, как это делается для Thread.Abort. – ZunTzu

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