Так есть ли способ реализовать преимущества async / await в сценарии Web API, когда в миксе есть синхронная операция?
Нет. Причина проста: асинхронность дает свои преимущества, освобождая поток, а синхронная операция блокирует поток.
Преимущество асинхронности на стороне сервера - масштабируемость . Асинхронность обеспечивает лучшую масштабируемость, потому что она освобождает свой поток, когда он не нужен .
По определению синхронный API блокирует поток. Если API является операцией, связанной с вводом / выводом, то он блокирует поток, который в основном просто ожидает ввода / вывода, т. Е. Поток не нужен, но также не может быть освобожден.
Там нет никакого способа обойти это;синхронный API должен блокировать поток, поэтому вы не сможете получить преимущества асинхронности.
Если у вас было приложение с графическим интерфейсом, то существует обходной путь. На стороне клиента основным преимуществом асинхронности является отзывчивость . Асинхронность обеспечивает лучшую скорость отклика, освобождая поток пользовательского интерфейса, когда он не нужен.
Для приложений с графическим интерфейсом вы можете использовать Task.Run
для блокировки потока пула потоков, и ваш поток пользовательского интерфейса остается отзывчивым;это подходящий обходной путь. В серверных приложениях использование Task.Run
, подобного этому, является антипаттерном, так как он вызывает переключение потоков, а затем вы все равно получаете заблокированный поток (предотвращая любые преимущества масштабируемости), поэтому Task.Run
просто замедляет ваш код без какой-либо выгоды. вообще.