День семьдесят третий. #CSharp8

Новые функции в C# 8.

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

Начиная с C# 8.0 вы можете создавать и потреблять потоки асинхронно. Метод, возвращающий асинхронный поток, имеет три свойства:

1. Объявляется с модификатором async.

2. Возвращает IAsyncEnumerable<T>.

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

Потребитель асинхронного потока должен добавить ключевое слово await перед ключевым словом foreach при переборе элементов потока. Добавление ключевого слова await требует, чтобы метод, который перечисляет элементы асинхронного потока, был объявлен с модификатором async и возвращал тип, разрешенный для асинхронного метода. Обычно это означает возврат типа Task или Task<TResult>, а также может быть ValueTask или ValueTask<TResult>. Метод может как потреблять, так и производить асинхронный поток, что значит, что он будет возвращать IAsyncEnumerable<T>.

Следующий код генерирует последовательность от 0 до 19 с ожиданием 100ms между генерациями каждого числа. Затем можно перебрать последовательность, используя выражение await foreach:

using System;

using System.Threading.Tasks;

using System.Collections.Generic;



static async Task Main(string[] args)

{

await foreach (var number in GenerateSequence())

{

Console.WriteLine(number);

}

}

public static async System.Collections.Generic.IAsyncEnumerable<int> GenerateSequence()

{

for (int i = 0; i < 20; i++)

{

await Task.Delay(100);

yield return i;

}

}



Заметьте, что для выполнения этого кода требуется установить SDK .NET Core 3.0 и использовать его в качестве Target framework в свойствах проекта. А чтобы он появился в этом списке, возможно, потребуется отметить флажок “Use previews of the .NET Core SDK” в Tools > Options > Projects and Solutions > .NET Core и перезагрузить Visual Studio.



Преимущества

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



Источники:

-
https://www.c-sharpcorner.com/article/c-sharp-8-features/

-
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8