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

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

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

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

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

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

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


    public static async Task ExecuteAsyncStream() {  
            await foreach(var number in GenerateSequence()) {  
                Console.WriteLine($ "The square of number {number.Number} is: {  
                        number.Square  
                    }  
                    ");  
                }  
            }  
            public static async IAsyncEnumerable < SquareNumber > GenerateSequence() {  
                for (int i = 1; i <= 10; i++) {  
                    await Task.Delay(200);  
                    yield  
                    return new SquareNumber {  
                        Number = i, Square = i * i  
                    };  
                }  
            }  
            public class SquareNumber {  
                public int Number {  
                    get;  
                    set;  
                }  
                public int Square {  
                    get;  
                    set;  
                }  
            }  

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

вывод

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

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

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

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

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


    public static void ExecuteLocalFunction() {  
        Console.WriteLine(InstanceLocalMethod());  
        Console.WriteLine(StaticLocalMethod());  
    }  
    static int InstanceLocalMethod() {  
        int x = 7;  
        return Square();  
        int Square() => x * x;  
    }  
    static int StaticLocalMethod() {  
        int x = 7;  
        return Square(x);  
        static int Square(int num) => num * num;  
    }  

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

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

Резюме

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