コンソールで入力した文字をそのまま出力します。
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();
}
}
コメント