なんか、表示処理がもたつくな~というときは、もしかすると、Invokeを複数回呼んでいるかもしれません。
sample.cs
async void SetTextTest()
{
var start = DateTime.Now;
//await Task.Run(() => 10000.Loop(i => Invoke((MethodInvoker)(() => textBox1.Text = i.ToString()))));
//await Task.Run(() => Invoke((MethodInvoker)(() => 10000.Loop(i => textBox1.Text = i.ToString()))));
MessageBox.Show("finish, " + (DateTime.Now - start).TotalMilliseconds.ToString());
}
//10000.Loopは1万回ループしていると思ってください
パフォーマンスは以下の通り(場合によってはもっと遅くなることも…)
遅いな~と思ったら、細かくInvokeを読んでいる可能性があるので、少し大きめにInvokeを使ってあげてください。
(あまり大きくとる(Invokeの中の処理時間が長い)と画面が固まりますが…、その時はそもそもの設計を見直してみてください)
余談ですが、通常、Invokeするときは InvokeRequired を使って必要以上に呼ばないようにすることも大切です。
FormExtension.cs
public static void InvokeEx(this Form form, Action inv)
{
if (form.InvokeRequired == true)
{
form.Invoke(inv);
}
else
{
inv();
}
}