
非同期メソッド内のスレッド番号について
前提・実現したいこと
非同期メソッドの中で、タスク外の処理はメインスレッド(番号1)で行われ、
タスク内はサブスレッド(番号3)で行われるものだと思ったのですが、
スレッド番号を取得してみたらタスク後の処理(SampleAsync完了と表示させる部分)がサブスレッドで行われているように見えました。
メソッド内でタスクが作られた場合それ以降はすべて非同期扱いになるのでしょうか?
あと必ず別スレッドの番号が3になるのですが2はないのでしょうか?
該当のソースコード
C#
1 static void Main(string[] args) 2 { 3 int mainId = Thread.CurrentThread.ManagedThreadId; 4 5 Console.WriteLine($"ID:{mainId}で開始"); 6 Console.WriteLine(1); 7 Console.WriteLine(2); 8 Task tsk = SampleAsync(); 9 Console.WriteLine(3); 10 Console.WriteLine(4); 11 tsk.Wait(); 12 Console.WriteLine(5); 13 Console.WriteLine(6); 14 Console.WriteLine($"ID:{mainId}で終了"); 15 16 Console.ReadLine(); 17 } 18 19 static async Task SampleAsync() 20 { 21 int mainThreadNumber = Thread.CurrentThread.ManagedThreadId; 22 Console.WriteLine($"ID:{mainThreadNumber}でSampleAsync開始..."); 23 24 await Task.Run(() => 25 { 26 int taskThreadNumber = Thread.CurrentThread.ManagedThreadId; 27 for (int i = 0; i <= 5; i++) 28 { 29 Console.WriteLine($"ID:{taskThreadNumber}で非同期実行中...[{i}]"); 30 } 31 }).ConfigureAwait(false); 32 33 int taskAfterNumber = Thread.CurrentThread.ManagedThreadId;//←のスレッド番号が3になっている 34 Console.WriteLine($"ID:{taskAfterNumber}でSampleAsync完了..."); 35 } 36
出力結果
C#
1ID:1で開始 21 32 4ID:1でSampleAsync開始...←スレッド番号1で開始している 53 64 7ID:3で非同期実行中...[0] 8ID:3で非同期実行中...[1] 9ID:3で非同期実行中...[2] 10ID:3で非同期実行中...[3] 11ID:3で非同期実行中...[4] 12ID:3で非同期実行中...[5] 13ID:3でSampleAsync完了...←タスク外だがスレッド番号が3になっている 145 156 16ID:1で終了

質問に書かれているのはコンソールアプリですよね? コンソールアプリと WinForms, WPF, ASP.NET とは非同期の場合のスレッドの使い方が違ってきますが、コンソールアプリ前提の話で良いのですか?

回答2件
あなたの回答
tips
プレビュー