利用例

(予定)

具体例いくつか挙げる

producer/consumer 的なの

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
 
public class Program
{
    static async IAsyncEnumerable<int> GenerateAsync()
    {
        var r = new Random();
 
        for (int i = 0; ; i++)
        {
            yield return i;
            await Task.Delay(TimeSpan.FromSeconds(r.NextDouble()));
        }
    }
 
    static async Task ConsumeAsync(IAsyncEnumerable<int> source)
    {
        var r = new Random();
 
        await foreach (var x in source)
        {
            Console.WriteLine(x);
            await Task.Delay(TimeSpan.FromSeconds(r.NextDouble()));
        }
    }
}

LINQ to Object 非同期版 (LINQ は今の実装だとパフォーマンス チューニングの結果イテレーター使わなくなったけど。 少なくとも初期実装はイテレーターだったし、 今でも「パフォーマンスよりもコードのきれいさ重視」だったらイテレーターを使うべき。)

static async IAsyncEnumerable<TResult> GenerateAsync<TSource, TResult>(IAsyncEnumerable<TSource> source, Func<TSource, TResult> selector)
{
    // (お作法的には引数の null チェックすべき)
    await foreach (var x in source)
    {
        yield return selector(x);
    }
}

非同期にまとまった単位のデータを読んで、データを1つ1つ列挙

static async IAsyncEnumerable<string> ReadLinesAsync(string directoryPath)
{
    foreach (var filePath in Directory.GetFiles(directoryPath, "*.txt"))
    {
        var lines = await File.ReadAllLinesAsync(filePath);
 
        foreach (var line in lines)
        {
            yield return line;
        }
    }
}

更新履歴

test

[雑記]

ブログ