C#_Form やコントロールの更新

Invoke を使ったソースメモ。

 

経緯

 以下のコードは最後の 1000 が表示されるのみ。1 ~ 順次表示されない。

理由は、
for ループはメインスレッドを占領しているから。

画面描画もメインスレッドなので、スレッドが占領されている間は
画面更新ができない。

    for(int i = 0; i < 1001; i++)
    {
        label.Text = i.ToString();
    }

for 分の中で label の Text を書き換えているコード。
for 実行中は Form が操作不可になっている。

for の中に label1.Refresh();
のコードを書くと強制再描画になり値が更新された。
が、Invoke を使うと安全に更新できるもようなので
こちらを使用する。

Invokeを使うと、マルチスレッドにしてもデータなど壊れず問題なく動作する。スレッドセーフ。
・label1.Refresh(); を書くことにより、 for ループが占領しているメインスレッドに 画面描画を
 処理を行わせているこのコードはシングルスレッド

 

Invoke 使用した 更新ソース 

ex )

    private void buttonTest_Click(object sender, EventArgs e)
    {
        Task.Run(() =>
        {
            for (int i = 0; i < 10001; i++)
            {
                Hoge(i);
            }
        });
    }
   
    private void Hoge(int i)
    {
        if (label1.IsDisposed) return;

        if (label1.InvokeRequired)
        {
            Invoke((MethodInvoker)delegate { Hoge(i); });
        }
        else
        {
            label1.Text = i.ToString();
        }
    }

 

 

こちらから。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=43508&KLOG=74
http://wa3.i-3-i.info/word12456.html

 

以上。ソース解読は後で。