LoginSignup
1
3

More than 5 years have passed since last update.

[Visual Studio 2015 C#] Invokeを複数回呼ぶと、Formの表示がもたつきますので避けましょう

Posted at

なんか、表示処理がもたつくな~というときは、もしかすると、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万回ループしていると思ってください

パフォーマンスは以下の通り(場合によってはもっと遅くなることも…)

前者
image
後者
image

遅いな~と思ったら、細かく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();

    }

}
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3