В С#,async
иawait
Ключевые словада Реализация асинхронного программированияосновные инструменты。Они позволяют разработчикам писать неблокирующий код.,тем самым улучшая отзывчивость приложенийи Пропускная способность。В этой статье будет подробно рассмотреноC#вasync
иawait
Ключевые слова,Включая их основные понятия, Метод реализации、Расширенное использование и лучшие практики.
Асинхронное программирование — это парадигма программирования, которая позволяет программе продолжать выполнение другого кода, ожидая завершения длительной задачи (например, операции ввода-вывода).
async
иawait
Ключевые словаasync
:Используется для объявления метода как асинхронного метода.,Он может содержать один или несколькоawait
выражение。await
:Используется для приостановки выполнения асинхронного метода.,Пока ожидающая задача не будет завершена.async
Объявить асинхронный методpublic async Task<int> GetCountAsync()
{
// Асинхронные операции
return await Task.Run(() => {
// Моделирование долго выполняющихся задач
Thread.Sleep(3000);
return 42;
});
}
await
Вызов асинхронного методаpublic async Task DoWorkAsync()
{
int count = await GetCountAsync();
Console.WriteLine($"The count is: {count}");
}
использоватьawait
Объединение нескольких асинхронных методов。
public async Task DoMultipleAsyncTasks()
{
var result1 = await Task.Run(() => DoWork1());
var result2 = await Task.Run(() => DoWork2());
// ...
}
в асинхронном методеиспользоватьtry-catch
блок для обработки исключений。
public async Task DoWorkAsync()
{
try
{
var result = await GetCountAsync();
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
использоватьCancellationToken
Приходить Отменить асинхронную операцию。
public async Task DoWorkWithCancellationAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
// Выполнить работу
await Task.Delay(1000, cancellationToken);
}
}
использоватьTask
изTimeout
метод Приходить Установить тайм-аут。
public async Task DoWorkWithTimeoutAsync()
{
try
{
await Task.Delay(5000); // Моделирование долго выполняющихся задач
}
catch (TaskCanceledException)
{
Console.WriteLine("The operation has timed out.");
}
}
await
в циклеиспользоватьawait
Может вызвать тупик。учитыватьиспользоватьTask.WhenAll
Приходить Параллельное выполнение цикловв Асинхронные операции。
var tasks = numbers.Select(async number => await ProcessNumberAsync(number));
await Task.WhenAll(tasks);
ConfigureAwait(false)
在库метод中использоватьConfigureAwait(false)
чтобы избежать ненужногоизпереключение контекста。
public void LibraryMethod()
{
var result = await GetResultAsync().ConfigureAwait(false);
}
Асинхронные конструкторы позволяют выполнять асинхронную инициализацию при создании объекта.
public class AsyncClass
{
private readonly int _data;
public AsyncClass()
{
_data = await GetDataAsync();
}
private async Task<int> GetDataAsync()
{
await Task.Delay(1000); // моделирование Асинхронные операции
return 42;
}
}
Убедитесь, что возвращаемое значение асинхронного метода используется правильно, иначе это может помешать оптимизации компилятора.
var result = await GetCountAsync(); // Убедитесь, что результат используется
IAsyncEnumerable
Асинхронное перечисление для больших объемов данных,использоватьIAsyncEnumerable
。
public async IAsyncEnumerable<int> GetNumbersAsync()
{
for (int i = 0; i < 100; i++)
{
await Task.Delay(100); // моделирование Асинхронные операции
yield return i;
}
}