Асинхронное программирование не является новой концепцией и существует уже несколько лет, и в настоящее время это новый стандарт в современных фреймворках, таких как AspNetCore. Эта структура теперь полностью асинхронна, и нелегко избежать использования ее ключевого слова async.

Я думаю, что когда дело доходит до асинхронизма, существует определенное облако опасений: разработчики иногда боятся его использовать, потому что не понимают, как его использовать и каковы его лучшие практики.

Другая причина этого чувства страха связана с тем, что в прошлом асинхронное программирование было действительно непросто. С появлением ключевых слов async / await в C # 5 с асинхронным программированием стало намного проще работать.

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

Что такое асинхронное программирование?

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

Ядром асинхронного программирования являются объектыTask, моделирующие асинхронные операции. Они поддерживаются ключевыми словами async и await.

С ключевым словом await происходит волшебство. Он передает управление вызывающей стороне метода, выполнившего await, и в конечном итоге позволяет службе быть эластичной.

Асинхронный полностью

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

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

Следующий фрагмент кода является хорошим примером, в котором синхронизация предпочтительнее асинхронной. Здесь использование Task.Result блокирует текущий поток, ожидая результата.

public int MyMethodAsync()
{
    var result = OtherMethodAsync().Result;
    return result + 1;
}

Правильный способ сделать это - использовать ключевое слово await для получения результата:

public async Task<int> MyMethodAsync()
{
    var result = await OtherMethodAsync();
    return result + 1;
}

Просто не возвращай async void, поверь мне

Никогда не следует использовать для возврата void в асинхронном методе в .Net, никогда.

Самая распространенная ситуация, когда люди считают, что async void - хорошая идея, - это когда реализуется запуск и забыл, а это совсем не так. Если в методе async void возникает какое-либо исключение, процесс будет остановлен.

Таким образом, вместо использования async void вы можете использовать Task.Run, поскольку, если произойдет какое-либо необработанное исключение, будет запущено TaskScheduler.UnobservedTaskException.

public void RunFireAndForgetOperation()
{
    Task.Run(FireAndForgetAsync);
}
public async Task FireAndForgetAsync()
{
    var result = await RunOperationAsync();
    ParseResult(result);
}

Async / await over Task return

Пожалуйста, отнеситесь к этому с долей скепсиса, потому что, когда дело доходит до производительности, возврат напрямую Task выполняется быстрее, потому что в асинхронном конечном автомате не выполняются вычисления, но с этим вы можете в конечном итоге не воспользоваться преимуществами асинхронного конечного автомата. . StateMachine - это структура, созданная с использованием ключевых слов async / await.

Таким образом, использование ключевых слов async / await дает несколько преимуществ:

  • Асинхронные и синхронные исключения нормализованы, чтобы всегда быть асинхронными;
  • Выброшенные исключения будут автоматически заключены в возвращаемый Task вместо того, чтобы удивлять вызывающего абонента фактическим исключением;
  • Код легче изменить;

Подводя итоги, вот некоторые практики, которым вы должны следовать, когда дело доходит до асинхронного программирования, и в Интернете есть множество замечательных ресурсов, которые вы можете использовать, чтобы узнать больше об этом предмете и улучшить свои навыки.

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

Не забывайте всегда искать понимание того, как вещи действительно работают, на более глубоком уровне и не пытайтесь просто следовать шаблонам, иначе вы можете закончить Антипаттерн Культа Карго.

Нельсон вон!