На самом деле это довольно интересный вопрос и сценарий. В какой-то степени асинхронность — это новая мода (хотя на самом деле это не так уж и ново). В Entity Framework 6 появились асинхронные методы, и каждый... отдельный... фрагмент... документации... внезапно начал использовать асинхронность для всего. Я думаю, что мы видим немного то же самое здесь. MVC 6 поддерживает асинхронность для таких вещей, как частичный рендеринг, так что, боже мой, теперь мы все просто должны использовать асинхронность.
Async служит одной очень конкретной цели. Это позволяет вернуть активный поток в пул для выполнения других задач, пока текущая задача находится в состоянии ожидания. Ключевой частью этого является «состояние ожидания». Некоторые задачи просто несовместимы с асинхронностью. Работа с привязкой к ЦП, такая как сложный финансовый анализ, никогда не позволяет потоку переходить в состояние ожидания, поэтому все эффективно выполняется как синхронизация, даже если вы настроили ее как асинхронную. С другой стороны, вещи, связанные с задержкой в сети (запрос ресурса из веб-API, запрос к базе данных и т. д.) или связанные с вводом-выводом (чтение/запись файлов и т. д.), могут иногда иметь периоды, когда поток ожидание завершения какого-либо другого процесса, прежде чем он продолжит обработку.
Что касается частичного рендеринга, единственная часть, которая не полностью связана с процессором, — это чтение самого файла представления из файловой системы. Хотя этого технически достаточно, чтобы сделать его подходящим для асинхронного режима, сколько времени на самом деле потребуется, чтобы прочитать текстовый файл, который, вероятно, не превышает 50 КБ. К тому времени, когда поток будет передан обратно в пул, вероятно, пришло время запросить его обратно, поэтому в этот момент вы фактически используете ресурсы более неэффективно.
Короче говоря, не попадайтесь в ловушку «это можно сделать асинхронно, поэтому я должен сделать это асинхронно». Каждое использование следует оценивать с точки зрения того, действительно ли в нем есть ценность. Async имеет много накладных расходов, и если вы говорите только о нескольких миллисекундах времени ожидания, это, вероятно, не стоит всех этих дополнительных накладных расходов.
person
Chris Pratt
schedule
24.02.2015