Асинхронность в C#: как не запутаться в потоке
Введение: зачем нам асинхронность?
В моих проектах я часто сталкиваюсь с задачами, которые требуют длительного времени для выполнения, например, загрузка данных из сети или обработка больших объёмов информации. Если такие задачи выполняются синхронно, приложение может «зависнуть», пока они не завершатся. Чтобы избежать этого, я использую асинхронное программирование.
Основы асинхронности в C#
Асинхронность в C# реализуется с помощью ключевых слов async и await. Метод, который может выполняться асинхронно, должен быть объявлен с модификатором async. Внутри такого метода можно использовать ключевое слово await для приостановки выполнения метода до завершения асинхронной операции.
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Начало программы");
await Delay(2000);
Console.WriteLine("Конец программы");
}
static async Task Delay(int milliseconds)
{
await Task.Delay(milliseconds);
Console.WriteLine($"Задержка на {milliseconds} миллисекунд");
}
}
В этом примере метод Main объявлен с модификатором async. Внутри метода используется ключевое слово await для приостановки выполнения до завершения асинхронной операции Delay.
Обработка ошибок в асинхронных методах
При работе с асинхронными методами важно учитывать возможность возникновения ошибок. Для обработки ошибок можно использовать блок try-catch.
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
try
{
await Delay(2000);
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
static async Task Delay(int milliseconds)
{
await Task.Delay(milliseconds);
Console.WriteLine($"Задержка на {milliseconds} миллисекунд");
throw new Exception("Что-то пошло не так");
}
}
В этом примере, если метод Delay вызывает исключение, оно будет обработано в блоке catch в методе Main.
Асинхронные коллекции
Для работы с асинхронными коллекциями можно использовать класс Task. Например, можно создать массив задач и дождаться их завершения с помощью метода Task.WhenAll.
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var tasks = new Task[3];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = Delay(i * 1000);
}
await Task.WhenAll(tasks);
Console.WriteLine("Все задачи выполнены");
}
static async Task Delay(int milliseconds)
{
await Task.Delay(milliseconds);
Console.WriteLine($"Задержка на {milliseconds} миллисекунд");
}
}
В этом примере создаётся массив задач, каждая из которых выполняет задержку на разное время. Метод Task.WhenAll ждёт завершения всех задач.
Заключение
Асинхронное программирование в C# позволяет избежать «зависания» приложения при выполнении длительных задач. Используя ключевые слова async и await, можно легко реализовать асинхронное выполнение методов. Надеюсь, этот мини-гайд поможет вам разобраться в асинхронности и использовать её в своих проектах.
