Tips

開発Tips(2025-11-25)

非同期処理を効率的に実装するために、`async`と`await`キーワードを活用し、UIスレッドのブロックを防ぎます。これにより、応答性の高いアプリケーションを構築できます。

C#

非同期処理を効率的に実装するために、asyncawaitキーワードを活用し、UIスレッドのブロックを防ぎます。これにより、応答性の高いアプリケーションを構築できます。

非同期ストリームによるデータ処理の効率化

IAsyncEnumerable<T> を使用すると、大規模なデータセットを非同期的にストリーミング処理できます。これにより、コレクション全体をメモリにロードすることなく、データのチャンクを順次処理できるため、メモリ使用量を削減し、パフォーマンスを向上させることができます。

public static async IAsyncEnumerable<string> ReadLinesAsync(string filePath)
{
    using (var reader = new StreamReader(filePath))
    {
        string? line;
        while ((line = await reader.ReadLineAsync()) != null)
        {
            yield return line;
        }
    }
}

public static async Task ProcessLinesAsync(string filePath)
{
    await foreach (var line in ReadLinesAsync(filePath))
    {
        // 各行を非同期的に処理する
        Console.WriteLine(line);
        await Task.Delay(100); // 例:処理に時間がかかるタスクをシミュレート
    }
}
  • 説明: IAsyncEnumerable<T>は、非同期的に反復処理できるコレクションを表します。上記の例では、ReadLinesAsyncメソッドは、ファイルから行を非同期的に読み取り、IAsyncEnumerable<string>として返します。ProcessLinesAsyncメソッドは、await foreachループを使用して、各行を順次処理します。

  • 注意点: 非同期ストリームを使用する際は、asyncawaitキーワードを正しく使用し、UIスレッドをブロックしないように注意してください。await foreach ループ内で時間のかかる処理を行う場合は、Task.Runなどを使用して、別のスレッドに処理を委譲することを検討してください。

  • おすすめポイント: 大量のデータをファイルから読み込んだり、ネットワーク経由で受信したりする場合に、IAsyncEnumerable<T>を使用すると、メモリ効率を向上させ、アプリケーションの応答性を維持できます。LINQ to Objectsと同様の拡張メソッド(Where, Selectなど)も利用できるため、柔軟なデータ処理が可能です。