Начало работы с асинхронным программированием

Завершено

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

C# поддерживает упрощенный асинхронный подход программирования, который использует асинхронную поддержку в среде выполнения .NET. Компилятор выполняет сложную работу, которую разработчик использовал для выполнения, и приложение сохраняет логическую структуру, которая напоминает синхронный код. В результате вы получаете все преимущества асинхронного программирования с частью усилий.

Понимание того, как асинхронные процессы работают в реальном мире, помогут вам понять, как использовать асинхронное программирование в приложениях.

Изучение асинхронного процесса в реальном мире

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

  1. Получите ингредиенты завтрака из кладовой.
  2. Налить чашку кофе.
  3. Разогрейте кастрюлю, а затем жарьте три среза бекона.
  4. Жарить два яйца.
  5. Поджарьте два кусочка хлеба.
  6. Разложите масло и варенье на тост.
  7. Налить стакан апельсинового сока.

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

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

Для параллельного алгоритма требуется несколько людей, которые готовят (или несколько потоков). Один человек готовит яйца, другой жарит бекон, и т. д. Каждый человек фокусируется на одной конкретной задаче. Каждый, кто готовит (или каждый поток), блокируется синхронно, ожидая, пока завершится текущая задача: бекон пора переворачивать, хлеб вот-вот всплывет из тостера и т. д.

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

Асинхрон улучшает скорость реагирования

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

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

Область приложения Типы .NET с асинхронными методами Типы среды выполнения Windows с асинхронными методами
Веб-доступ HttpClient Windows.Web.Http.HttpClient, SyndicationClient
Работа с файлами JsonSerializer, StreamReader, StreamWriter и т. д. StorageFile
Работа с изображениями MediaCapture, BitmapEncoder, BitmapDecoder
Программирование WCF Синхронные и асинхронные операции

Создание и вызов асинхронных методов

В C# асинхронные операции реализуются с помощью ключевых слов async и await. Ключевое async слово используется для определения асинхронного метода, а await ключевое слово используется для вызова асинхронного метода и ожидания его результата без блокировки вызывающего потока. Асинхронные операции обычно реализуются с помощью Task или Task<T> типов, представляющих текущую операцию, которую можно ожидать.

Ниже приведен пример создания и вызова асинхронной задачи в C#:


using System;
using System.IO;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main()
    {
        string filePath = "example.txt";
        string content = await ReadFileAsync(filePath);
        Console.WriteLine(content);
    }

    public static async Task<string> ReadFileAsync(string filePath)
    {
        using (StreamReader reader = new StreamReader(filePath))
        {
            string content = await reader.ReadToEndAsync();
            return content;
        }
    }
}

В этом примере метод ReadFileAsync определяется с помощью ключевого слова async и имеет тип возвращаемого Task<string> значения. Ключевое async слово указывает, что метод содержит асинхронные операции, а возвращаемый тип Task<string> указывает, что метод возвращает задачу, представляющую асинхронную операцию. Тип Task<string> — это универсальная задача, представляющая асинхронную операцию, возвращающую строковое значение. Метод ReadFileAsync принимает путь к файлу в качестве параметра и считывает содержимое файла асинхронно.

Метод Main также объявляется как асинхронный, что позволяет вызывать метод ReadFileAsync с помощью ключевого слова await. await Ключевое слово используется для указания того, что программа должна ожидать результата асинхронной операции, прежде чем продолжить. В этом случае программа ожидает, пока файл будет считываться перед печатью его содержимого в консоль.

Сводка

В этом уроке вы узнали о преимуществах асинхронного программирования и о том, как он может повысить скорость реагирования приложений. Вы также узнали, как создавать и вызывать асинхронные методы с помощью asyncawait ключевых слов в C#. С помощью этих методов можно создавать более эффективные и адаптивные приложения, которые могут обрабатывать потенциально блокирующие операции, не заморажив пользовательский интерфейс или блокируя другие задачи.

Ключевые моменты

  • Асинхронное программирование повышает производительность приложения и скорость реагирования.
  • C# предоставляет упрощенный подход к асинхронному программированию.
  • Асинхронное программирование полезно в потенциально блокирующих действиях, таких как веб-доступ.
  • В C#асинхронные методы создаются с помощью ключевого async слова и вызываются с помощью ключевого await слова.
  • Task Task<T> Типы представляют текущие операции, которые можно ожидать в C#.