スレッド
プログラミングC# p505
まずはサンプルを単純化してコピる。
using System; using System.Threading; class ThreadTest { static void Main(string[] args) { Thread t = new Thread(new ThreadStart(delegate(){ for(int i=0; i<30; i++) { Console.WriteLine("i = " + i); } })); t.Start(); Console.WriteLine("Thread Start."); } }
結果はこう。
i = 0 i = 1 i = 2 i = 3 i = 4 i = 5 i = 6 i = 7 i = 8 i = 9 i = 10 i = 11 i = 12 i = 13 Thread Started. i = 14 i = 15 i = 16 i = 17 i = 18 i = 19 i = 20 i = 21 i = 22 i = 23 i = 24 i = 25 i = 26 i = 27 i = 28 i = 29
というわけで、スレッドをスタートした時点でカウントアップは始まり、Thread Start.のメッセージもスレッドの処理の完了を待たず出力されている。
しかも非同期デリゲートの時のように、スレッドが終わってないのにメインが終わってしまうというマヌケなことにもなってない。いい感じですね。
じゃあ、スレッドの完了を待ってみる場合はJoinが使えるだろうということで、使ってみる。
using System; using System.Threading; class ThreadTest { static void Main(string[] args) { Thread t = new Thread(new ThreadStart(delegate(){ for(int i=0; i<30; i++) { Console.WriteLine("i = " + i); } })); t.Start(); Console.WriteLine("Thread Start."); t.Join(); Console.WriteLine("Thread End."); } }
結果はこう。
i = 0 i = 1 i = 2 i = 3 i = 4 i = 5 i = 6 i = 7 i = 8 i = 9 i = 10 i = 11 i = 12 i = 13 Thread Start. i = 14 i = 15 i = 16 i = 17 i = 18 i = 19 i = 20 i = 21 i = 22 i = 23 i = 24 i = 25 i = 26 i = 27 i = 28 i = 29 Thread End.
素直に動く。いい感じ。