Ожидание foreach
Запись await foreach обходит
IAsyncEnumerable<T> из
System.Collections.Generic. На каждом
шаге ожидается следующий элемент асинхронного
итератора; для этого метод с yield
объявляют как async IAsyncEnumerable<T>.
Тело цикла выполняется в async-методе
и использует await.
Синтаксис
await foreach (тип элемент in источник)
{
// тело
}
Пример
Давайте обойдем асинхронный поток из трёх чисел:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static async IAsyncEnumerable<int> GetNums()
{
yield return 1;
yield return 2;
yield return 3;
}
static async Task Main()
{
await foreach (int num in GetNums())
{
Console.WriteLine(num);
}
}
}
Результат выполнения кода:
1
2
3
Пример
Давайте отдадим строки из асинхронного итератора:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static async IAsyncEnumerable<string> GetLines()
{
yield return "abcde";
yield return "12345";
}
static async Task Main()
{
await foreach (string line in GetLines())
{
Console.WriteLine(line);
}
}
}
Результат выполнения кода:
"abcde"
"12345"
Пример
Давайте накапливать сумму в цикле:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static async IAsyncEnumerable<int> GetNums()
{
yield return 1;
yield return 2;
yield return 3;
}
static async Task Main()
{
int sum = 0;
await foreach (int num in GetNums())
{
sum += num;
}
Console.WriteLine(sum);
}
}
Результат выполнения кода:
6
Пример
Давайте выведем только первые два элемента:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static async IAsyncEnumerable<int> GetNums()
{
yield return 1;
yield return 2;
yield return 3;
}
static async Task Main()
{
int count = 0;
await foreach (int num in GetNums())
{
Console.WriteLine(num);
count++;
if (count == 2)
{
break;
}
}
}
}
Результат выполнения кода:
1
2
Смотрите также
-
оператор
await,
которым ждут одну задачу -
цикл
foreach,
синхронный аналог обхода коллекции -
оператор yield,
которым отдают элементы итератора -
модификатор
async,
который нужен для асинхронного метода