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();