メモ:C#でスレッド

今どきはC#ならasync/awaitが使えるのでThreadを使う機会は減ったけどやはり使う時は使うものである。たまにしか使わないと忘れるのでメモ。

(1) スレッドの起動

ThreadStartというデリゲートを使うのがポイント。というかC#の妙ちくりんなところ。短い処理であればラムダ式で書いた方が簡潔。

using System.Threading;
    Thread threadHoge;
    // スレッドの起動
    threadHoge = new Thread(new ThreadStart(funcHoge));
    threadHoge.Start();
    private void funcHoge()
    {
        // スレッドの処理
    }

(2) スレッドの終了待ち合わせ

    // スレッドの終了待ち合わせ
    threadHoge.Join();

(3) スレッドからUIを操作

メインスレッド(UIスレッド)以外のスレッドからUIを操作するにはInvokeまたはBeginInvokeを使う。Actionというデリゲートを使うのがポイント。というかC#の妙ちくりんなところ。たいていは数行ですむのでラムダ式で書くと簡潔だが、ラムダ式そのものを引数にはできない。
Invokeなら同期、BeginInvokeなら非同期で処理される。

    // 同期処理
    this.Invoke((Action)(() => {
        textboxHoge.Text = "Hoge";
    }));
    // 非同期処理
    this.BeginInvoke((Action)(() => {
        textboxHoge.Text = "Hoge";
    }));

(4) 排他処理

ロック用のオブジェクトを定義してロックする。デッドロックに注意。(イベントハンドラはスレッドでないことに注意。)

    // ロック用オブジェクト
    object lockobj = new object();
    lock(lockobj )
    {
        // 排他処理
    }