C#のコンソールで入力した文字を表示する「順次処理キューによる非同期処理」

C# コンピュータ
C#

コンソールで入力した文字をそのまま出力します。
Endと入力すると終了します。

文字入力をメインスレッドで、文字出力をサブスレッドで実行しています。
スレッド間で文字列をキューを介して送受信しています。

using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // スレッドセーフなキュー
        var queue = new ConcurrentQueue<string>();
        var cts = new CancellationTokenSource();
        var token = cts.Token;

        // 出力スレッド
        Task outputTask = Task.Run(() =>
        {
            while (!token.IsCancellationRequested)
            {
                // キューにデータがある場合は取り出して表示
                if (queue.TryDequeue(out string? message))
                {
                    if (message == "End")
                    {
                        Console.WriteLine("終了します。");
                        cts.Cancel();  // メインスレッドも止める
                        break;
                    }
                    Console.WriteLine(message);
                }
                else
                {
                    // キューが空なら少し待つ
                    Thread.Sleep(100);
                }
            }
        }, token);

        // メインスレッドで入力処理
        while (!cts.IsCancellationRequested)
        {
            string? input = Console.ReadLine();
            if (input != null)
            {
                queue.Enqueue(input);
                if (input == "End")
                {
                    // 出力スレッドに終了シグナルを送る
                    break;
                }
            }
        }

        // 出力スレッドの終了を待つ
        outputTask.Wait();
    }
}

コメント