C#.NETのサンプルコードを掲載しています。
      
サブスレッドでコントロールを操作するには?
サブスレッド処理内でコントロールへアクセスすると例外が発生します。
これは、複数のスレッドからWindowsフォームコントロールへアクセスすると
競合状態やデットロックなどのバグが発生するためです。.NET Frameworkがスレッドセーフ
でない方法でコントロールへのアクセスするとInvalidOperationException となります。

では、例外を発生されずにコントロールへアクセスするためにはどうするか?
下記のサンプルはInvokeメソッドを用いて、コントロールを生成したスレッドに処理を移し
コントロールにアクセスしています。

テストコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void Test()
{
    Thread thread = new Thread(new ThreadStart(TestThreadProc));
    thread.Start();
}

private void TestThreadProc()
{
    // コントロールを生成したスレッドの場合 InvokeRequired は false となります。
    if (this.InvokeRequired)
    {
        // コントロールを生成したスレッドに処理を委譲します。
        this.Invoke((MethodInvoker)delegate() { TestThreadProc(); });
        return;
    }

    // 以降はスレッドで処理したいコードを記します。
    label1.Text = "ラベルText変更";
}



実はこのソース重要な欠点がありました。↓も読んでくれると嬉しいです。
[関連記事] サブスレッドでコントロールを操作するときの注意点
      
スレッド(Thread)






Copyright (C) 2011 - 2017 猫の気ままなC#日記