C#_別スレッドからコントロールを操作 01

BeginInvoke と EndInvoke でも出来るようだが
InvokeRequired の方が安全 ( スレッドセーフ ) らしいし、コードがなんか楽そう

 

フォームでスレッドを生成した場合、
フォームやコントロールに対して、その生成したスレッドからの操作は
動作が保証されない

Control クラスには、別スレッドからコントロールを操作する場合に使用できる
Invoke メソッドが用意されている。
Invoke メソッドを使うと、コントロールに対する操作を
メインスレッドで実行させることができる

 

書き方  Piyo を使わないコードの方がいいかも

メインメソッドで実行したいメソッドに対応したデリゲートを生成し、
そのデリゲートのインスタンス
Invoke メソッドのパラメータで指定して呼び出す。

ex ) ボタンクリックで 0 ~ 1000 まで表示。
     別スレッドからの呼び出し時に動く。メインからだと動かない。

        private void buttonTest_Click(object sender, EventArgs e)
        {
            // 別スレッドで動かす
            Task.Run(( ) =>
            {
                for (int i = 0; i < 1001; i++)
                {
                    Hoge(i);
                }
            });
        }
       
        delegate void HogeDelegate(int i);

        private void Hoge(int i)
        {
            if (label1.IsDisposed) return;

            if (label1.InvokeRequired)
            {
                Invoke(new HogeDelegate(Piyo), new object[ ] { i });
            }
        }
       
        private void Piyo(int i)
        {
            label1.Text = i.ToString();
        }


Control.IsDisposed
コントロールが破棄されているとObjectDisposedException例外が発生


try catch  文で囲まないと、
処理途中でウィンドウなど閉じた場合、
ObjectDisposedException 例外が
Invoke((MethodInvoker)delegate { Hoge(i); }); で発生。

 

InvokeRequired プロパティ

Invoke メソッドを使う必要があるかどうかをチェックするプロパティ。

Piyo 呼び出したスレッドが
コントロールの生成されたメインスレッドかどうかを調べる。
メインスレッドなら false 、別スレッドなら true を返す。

 

別スレッドでも同一スレッドでも Piyo が動作するようには、

    if (label1.InvokeRequired)
    {
        Invoke(new HogeDelegate(Piyo), new object[ ] { i });
    }
    else
    {
        Piyo(i);
    }

同じスレッド内でも
Invoke メソッドを利用したコントロールの操作は特に問題ないらしいが、
同一スレッドからのコントロールの操作を Invoke メソッドで行うのは無駄。
InvokeRequired プロパティを使えば、この無駄な処理を省くことができる。

 

 

こちらから。
http://www.atmarkit.co.jp/ait/articles/0506/17/news111.html
https://so-zou.jp/software/tech/programming/c-sharp/thread/thread-safe-call.htm
http://ultrad2.blogspot.jp/2007/10/invokedelegate.html
http://ufcpp.net/study/csharp/misc_delegate.html
http://wa3.i-3-i.info/word12295.html

 

以上。続く。