При создании приложения довольно часто возникает ситуация, когда необходимо выполнить какой-то трудоёмкий процесс. При этом блокируется пользовательский интерфейс и пользователь просто ждёт, пока приложение "отвиснет". Для решение этой проблемы есть возможность выполнения операций в разных потоках. Их удобная реализация представлена в виде async/await. В этой статье показано на что способна данная система, подробнее обо всех тонкостях в следующих статьях.
Что это?
Асинхронность в программировании — выполнение процесса в неблокирующем режиме системного вызова, что позволяет потоку программы продолжить обработку.
Как использовать?
Необходимо при написании заголовка метода, после модификатора доступа дописать ключевое слово async. В качестве возвращаемого типa может быть: void, Task, Task<type>, ValueTask<type>. Такой метод говорит нам, что может содержать блоки кода, которые будут вызываться асинхронно при использовании await.
Пример
Реализуем консольный проект и сделаем в нём имитацию пользовательского интерфейса, в котором будет анимация загрузки с сообщением (в нашем случае только сообщение). И сделаем отображение данных из файла.
Ниже представлен класс пользовательского интерфейса.
Далее реализуем отображение данных из файла, которые представлены классом FileService.
Осталось вызвать данные методы в классе Program.
Какова будет последовательность вывода данных? В первую очередь отобразится информация из метода userInterface.ShowUI(), далее создается экземпляр класса FileService и запускается метод userInterface.LoadingCommand, в который передается делегат, метод отображения данных из файла. Внутри метода ShowDataFromFileAsync запускается асинхронно получение данных и потом отображается. Следовательно работа метода Main в классе Program продолжится и мы не можем сказать точно, что выполнится быстрее отображение сообщения в методе Main, или асинхронное получение данных. Результат:
В данном случае после того, как мы получили и отобразили данные закончился метод Main и вывел сообщение, а потом закончился метод LoadingCommand.
Спасибо за внимание!
Телеграмм канал: https://t.me/dotnetreview