Что произойдет, если вы вызовете метод блокировки в вызове asyn c? - PullRequest
0 голосов
/ 26 мая 2020

Если вы создаете приложение с поддержкой aysn c и вам нужно взаимодействовать со сторонней библиотекой, которая предоставляет только методы блокировки, что происходит, когда метод async блокируется?

Простой пример: Net Framework, Socket.Receive позволяет вам установить тайм-аут, но затем блоки. Если сторонняя библиотека обертывает это, и я вызываю это в асинхронном методе, это просто означает, что какой бы поток, который среда выполнения назначает Task, заблокирован? Может ли он блокировать другие задачи или иметь другие побочные эффекты?

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Если сторонняя библиотека обертывает это, и я вызываю это в рамках асинхронного метода, это просто означает, что какой бы поток, который среда выполнения назначает Задаче, заблокирован?

Да. В лучшем случае он блокирует ваш поток задач, а в худшем, если вы были в каком-либо Synchronization Context (Desktop GUI или ASP.NET Request Threads before .Net Core), вы застрянете в тупике!

Может ли он заблокировать другие задачи или есть другие побочные эффекты?

Если вы оберните метод блокировки потоком с именем T , который определяется как Task.Run(/* Blocking method */), он заблокирует T .

1 голос
/ 26 мая 2020

Нет ничего плохого в блокировке в методе async. Однако есть последствия.

Если вы заблокируете метод async void, который вызывается событием пользовательского интерфейса, вы также заблокируете поток пользовательского интерфейса и сделаете свой пользовательский интерфейс невосприимчивым.

Когда вы заблокируете в async Task method, или в любом Task вы, конечно, заблокируете поток, который в настоящее время выполняет эту часть метода или эту задачу. Если вы запускаете одновременно несколько экземпляров этой задачи или если ваш метод выполняется одновременно (например, это метод службы, который вызывается многими клиентами), вы можете исчерпать пул потоков. Это может помешать запуску других задач или вызову вашей службы другими клиентами.

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

...