Thread①
スレッドの基本①
スレッドの作成
var thread = new Thread(() => hoge());
ラムダ式に引数を与えることもできます。
単一の引数のみ許容し、object型として扱われます。
var thread = new Thread(hoge => fuga());
ラムダ式の代わりに専用のデリゲートを渡すこともできます。
ただし、これはレガシーな方法です。
Actionは使用できません。
new Thread(new ThreadStart({メソッド名})); new Thread(new ParameterizedThreadStart({単一引数のメソッド名});
スレッドの開始
Start()メソッドで開始されます。
thread.Start();
スレッドはフォアグラウンドプロセスになります。
アプリケーションはスレッドの終了を待機します。
IsBackGroundプロパティにtrueを設定することでバックグラウンドプロセスとして動きます。
この場合、アプリケーションはスレッドの終了を待機しません。
スレッドの中止
Abort()メソッドで中止できます。
thread.Abort();
即時にスレッドが中止されるため、実行中の処理がやりかけの状態になる可能性があります。
スレッド外の変数をスレッド内でキャプチャすることでコントロールするほうが安全です。
スレッドの同期
Join()を実行することで、対象スレッドの終了を待機できます。
以下コードでは、thread2のコンソール出力はthread1の終了を待って行われます。
var thread1 = new Thread( () => { Thread.Sleep(1000); Console.WriteLine("thread1 processed"); }); var thread2 = new Thread( () => { thread1.Join(); Console.WriteLine("thread2 processed"); }); thread2.Start(); thread1.Start();