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