В этой статье вы узнаете о C # Async Stream и статических локальных функциях.

Асинхронные потоки

Помимо других функций, асинхронные потоки также являются одной из важных функций, представленных в C # 8. Он обеспечивает возможность асинхронного доступа к потоку данных, который был недоступен ранее. Теперь вы можете создавать и использовать потоки асинхронно.

Асинхронные потоки имеют следующие характеристики.

  • Он объявлен с модификатором async и возвращает IAsyncEnumerable <T>.
  • Метод содержит операторы yield return для возврата последовательных элементов в асинхронном потоке данных.

Модель программирования, основанная на async и await, была одним из основных нововведений C # 5, а async streams — еще одним усовершенствованием над шаблоном async и await для более интуитивного написания асинхронного кода. С помощью асинхронных потоков разработчик теперь может легко реализовать асинхронные потоки данных, а также выполнять итерацию асинхронно с помощью цикла foreach. Это возможно благодаря введению новых интерфейсов IAsyncEnumerable <T> и IAsyncDisposable <T>.

Давайте посмотрим на приведенный ниже код, чтобы понять, как работать с асинхронными потоками.

[pastacode lang=»c» manual=»%0A%20%20%20%20public%20static%20async%20Task%20ExecuteAsyncStream()%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20await%20foreach(var%20number%20in%20GenerateSequence())%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%24%20%22The%20square%20of%20number%20%7Bnumber.Number%7D%20is%3A%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20number.Square%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20public%20static%20async%20IAsyncEnumerable%20%3C%20SquareNumber%20%3E%20GenerateSequence()%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(int%20i%20%3D%201%3B%20i%20%3C%3D%2010%3B%20i%2B%2B)%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20await%20Task.Delay(200)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20yield%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20new%20SquareNumber%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Number%20%3D%20i%2C%20Square%20%3D%20i%20*%20i%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20public%20class%20SquareNumber%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20public%20int%20Number%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20get%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20set%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20public%20int%20Square%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20get%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20set%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A» message=»» highlight=»» provider=»manual»/]

Вывод приведенного ниже кода генерируется следующим образом.

вывод

IAsyncEnumerable используется с yield return, а затем вы можете использовать поток данных с помощью await foreach.

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

Статические локальные функции

Локальные функции были введены в C# 7, а статические локальные функции — еще одно усовершенствование в C# 8.

Локальная функция экземпляра может получить доступ к переменным родительского метода, а статический локальный метод — нет. Давайте посмотрим на следующий пример, чтобы понять разницу между локальными и статическими локальными функциями.

[pastacode lang=»c» manual=»%0A%20%20%20%20public%20static%20void%20ExecuteLocalFunction()%20%7B%20%20%0A%20%20%20%20%20%20%20%20Console.WriteLine(InstanceLocalMethod())%3B%20%20%0A%20%20%20%20%20%20%20%20Console.WriteLine(StaticLocalMethod())%3B%20%20%0A%20%20%20%20%7D%20%20%0A%20%20%20%20static%20int%20InstanceLocalMethod()%20%7B%20%20%0A%20%20%20%20%20%20%20%20int%20x%20%3D%207%3B%20%20%0A%20%20%20%20%20%20%20%20return%20Square()%3B%20%20%0A%20%20%20%20%20%20%20%20int%20Square()%20%3D%3E%20x%20*%20x%3B%20%20%0A%20%20%20%20%7D%20%20%0A%20%20%20%20static%20int%20StaticLocalMethod()%20%7B%20%20%0A%20%20%20%20%20%20%20%20int%20x%20%3D%207%3B%20%20%0A%20%20%20%20%20%20%20%20return%20Square(x)%3B%20%20%0A%20%20%20%20%20%20%20%20static%20int%20Square(int%20num)%20%3D%3E%20num%20*%20num%3B%20%20%0A%20%20%20%20%7D%20%20%0A» message=»» highlight=»» provider=»manual»/]

Оба метода в приведенном выше коде возвращают один и тот же результат, однако, как вы можете видеть, метод StaticLocalMethod не использует переменную экземпляра x и вместо этого должен был объявить локальную переменную num. Если он пытается использовать переменную x, возникает ошибка времени компиляции, поскольку «Статическая локальная функция не может содержать ссылку на x».

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

Резюме

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