最終的には Javaの SingleThread の ExectorService を C# で実現したい。 今回はとりあえず Task を使った非同期の記述方法を軽く調べてみる。
今回は Windows 11 にインストールした .NET 6 を WSL Ubuntu 20.04 上で実行しています。
$ dotnet.exe --version
6.0.101
$ dotnet.exe new console -n HelloThread
$ cd HelloThread
$ dotnet.exe run
Hello, World!
Program.cs を以下のように編集:
var task = Task.Run(()=>
{
Console.WriteLine("Hello, World!");
});
task.Wait();
実行:
$ dotnet.exe run
Hello, World!
さらに Program.cs を編集:
Action<object?> action = (object? it)=>{
Console.WriteLine($"Hello, World! ({it})");
};
Task task = new Task(action, "1");
task.Start();
task.Wait();
実行:
$ dotnet.exe run
Hello, World! (1)
new Task してから、task.Start() する代わりに、Task.Factory.StartNew() で一行で記述できる:
//Task task = new Task(action, "1");
//task.Start();
Task task = Task.Factory.StartNew(action, "1");
引数を渡してアクションを生成、そのアクションを Task を使って非同期に(別スレッドで)実行する方法はわかりました。 これを使って、複数のタスクを非同期に実行するコードを書いてみる。
Program.cs を編集:
Action<object?> action = (object? it)=>{
Console.WriteLine($"Hello, World! ({it})");
};
List<string> list = new List<string>(){"1","2","3"};
for(int i=0; i<list.Count; i++){
Task.Factory.StartNew(action, list[i]);
};
// 非同期の処理が完了するのを待つ.
Thread.Sleep(1000);
実行:
$ dotnet.exe run
Hello, World! (2)
Hello, World! (1)
Hello, World! (3)
この場合、複数実行したタスクの処理順は不定です。