C # Async ждут, что проблема тупика ушла в .NetCore? - PullRequest
0 голосов
/ 12 ноября 2018

В .NetFramework был высокий риск возникновения тупика при синхронизации с контекстом синхронизации с использованием:

var result =  asyncMethod().Result; 
var result =  asyncMethod().GetAwaiter().GetResult();

вместо

var result = await asyncMethod();

( прочитано Стивеном Клирипост для дополнительной информации )

Поскольку контекст синхронизации был удален в .NetCore.Означает ли это, что вышеуказанные методы теперь безопасны в использовании?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы можете заблокировать асинхронный код - но вы не должны

Первое и наиболее очевидное следствие - отсутствие контекста, захваченного await,Это означает, что блокировка асинхронного кода не приведет к взаимоблокировке.Вы можете использовать Task.GetAwaiter (). GetResult () (или Task.Wait или Task.Result), не опасаясь тупиковой ситуации.Тем не менее, вы не должны.Поскольку в тот момент, когда вы блокируете асинхронный код, вы в первую очередь отказываетесь от всех преимуществ асинхронного кода.Расширенная масштабируемость асинхронных обработчиков аннулируется, как только вы блокируете поток.В (устаревшем) ASP.NET было несколько сценариев, где блокировка, к сожалению, была необходима: фильтры ASP.NET MVC и дочерние действия.Однако в ASP.NET Core весь конвейер полностью асинхронный;оба фильтра и компоненты представления выполняются асинхронно.В заключение, в идеале вы должны стремиться использовать асинхронный полностью;но если ваш код нуждается в этом, он может блокировать без опасности.

- Извлечение из блога Стивена Клири

Кредит GSerg для поиска сообщения

Однако вы можете столкнуться с голоданием пула потоков

http://labs.criteo.com/2018/10/net-threadpool-starvation-and-how-queuing-makes-it-worse/

0 голосов
/ 12 ноября 2018

Да и нет. Это правда, что в .NET Core нет контекста синхронизации, и поэтому один из основных источников проблем взаимоблокировки был устранен. Однако это не означает, что тупики абсолютно невозможны. Несмотря на это, вы не должны допускать, чтобы хорошие практики программирования исчезли, просто потому, что это не может быть большой проблемой ни при каких обстоятельствах. В частности, ASP.NET Core полностью асинхронен, поэтому нет оснований когда-либо использовать синхронизирующую версию метода или просто блокировать асинхронную задачу. Используйте await как и всегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...