Home About
C# , .NET

C# .NET で Task を使って非同期に処理を実行(その1)

最終的には Javaの SingleThread の ExectorService を C# で実現したい。 今回はとりあえず Task を使った非同期の記述方法を軽く調べてみる。

環境

今回は Windows 11 にインストールした .NET 6 を WSL Ubuntu 20.04 上で実行しています。

$ dotnet.exe --version
6.0.101

HelloThread プロジェクトの作成

$ 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)

この場合、複数実行したタスクの処理順は不定です。