利用例
(予定)
具体例いくつか挙げる
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;
}
}
}