Да, это фальшивка async
и менее масштабируемая, так как он запускает поток и блокирует его, его нельзя вернуть обратно до его завершения.
Однако
Я называю такие методы «поддельными асинхронными методами», потому что они выглядятасинхронный, но на самом деле просто притворяется, выполняя синхронную работу в фоновом потоке.В общем случае не используйте Task.Run при реализации метода;вместо этого используйте Task.Run для вызова метода.Есть две причины для этого руководства:
- Потребители вашего кода предполагают, что если метод имеет асинхронную сигнатуру, то он будет действовать действительно асинхронно.Фальсифицировать асинхронность, просто выполняя синхронную работу в фоновом потоке, - удивительное поведение.
- Если ваш код когда-либо используется в ASP.NET, фальшивый асинхронный метод ведет разработчиков по неверному пути.Цель асинхронности на стороне сервера - масштабируемость, а ложные асинхронные методы менее масштабируемы, чем просто использование синхронных методов.
Идея выставления оболочек «асинхронный по синхронизации» также очень скользкая, чтодоведение до крайности может привести к тому, что каждый отдельный метод будет представлен как в синхронной, так и в асинхронной форме.Многие из тех, кто спрашивает меня об этой практике, рассматривают возможность использования асинхронных оболочек для длительных операций с привязкой к процессору.Намерение хорошее: помочь с отзывчивостью.Но, как было сказано, отзывчивость может быть легко достигнута потребителем API, и потребитель действительно может сделать это на правильном уровне, а не для каждой болтливой отдельной операции.Кроме того, определить, какие операции могут быть длительными, на удивление сложно.Временная сложность многих методов часто значительно различается.
Однако вы на самом деле не вписываетесь ни в одну из этих категорий.Из вашего описания вы размещаете эту услугу WCF.В любом случае он будет выполнять ваш код асинхронно, если вы правильно установили InstanceContextMode
и ConcurrencyMode
.Кроме того, у вас будет возможность запускать оболочки TBA для вашего звонка из клиента, если вы сгенерировали прокси-серверы с соответствующими настройками.
Если я вас правильно понял, вы можете просто позволить этому методу быть полностью синхронным,и пусть WCF позаботится о деталях и сэкономит ресурсы
Обновление
Пример: если я использую Task.Run внутри любогоМетод веб-службы, я даже могу вызвать Thread.Sleep (10000) внутри Task.Run, и сервер будет реагировать на любой входящий трафик.
Я думаю, что следующее может помочь вам наиболее
Сеансы, экземпляры и параллелизм
Сеанс - это корреляция всех сообщений, отправленных между двумя конечными точками.Экземпляр относится к управлению временем жизни определенных пользователем сервисных объектов и связанных с ними объектов InstanceContext.Параллельность - это термин, который используется для управления количеством потоков, одновременно выполняющихся в InstanceContext.
Похоже, что ваша служба WCF настроена на InstanceContextMode.PerSession
и ConcurrencyMode.Single
.Если ваша служба не имеет состояния, вы, вероятно, захотите использовать InstanceContextMode.PerCall
и использовать async
только тогда, когда у вас есть что-то, что действительно можно ожидать