Асинхронное программирование C# в чем идея. Давайте разберемся.

просто мем для кайфа
просто мем для кайфа

Концептуальная идея асинхронного программирования заключается в эффективном использовании ресурсов, в первую очередь это потоки (threads).

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

Как итог приложение намертво зависало, так как не могло обрабатывать сообщение от пользователя, пока операция не завершится. В том числе могло быть так, даже так зачастую и было, висла вся система. Потому что происходил lock потока на время ожидания результата операции.

С появлением многопоточности и пулов потоков проблема была частично решена. Теперь, чтобы не блокировать UI, мы можем, например, вынести тяжелую задачу в фоновый поток. Однако стоит помнить - создание потока это дорого. В общем тут больше про арифметику и Computer Science, углублять в цифры не буду. Если сейчас память не изменяет, каждый поток потребляет от 512Кб до 1МБ. Много это или мало, зависит конечно от многих факторов, в том числе и от масштабов приложения, системы на котором это будет хоститься, либо использоваться. Помимо потреблеения памяти, это создает нагрузку на планировщик ОС при переключении контекста.

Во время операций ввода-вывода (I/O-bound operations), таких как запрос к базе данных, чтение файла или API вызов, поток большую часть времени просто ожидает ответа от внешнего устройства (проще говоря от endpoint'a) и в это время конечно же он не делает полезной работы, пока дожидается ответа. Хотя дожидаться это вроде бы тоже работа :)

Кульминационный момент.

На свет появляется величайшее асинхронное программирование чтобы победить эту проблему. И теперь вместо того чтобы блокировать поток на время ожидания, мы используем ключевые слова async/awit. Когда асинхронная операция начинается, текущий поток освобождается и возвращается в пул потоков, где может быть использован для выполнения другой работы. Как только операция I/O (ввода/вывода) завершается, .NET CLR возьмет любой свободный поток из пула и продолжит выполнение нашего метода с того места, где оно остановилось.

1
1 комментарий