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
以上。ソース解読は後で。