1. ホーム
  2. c#

UIスレッドからGUIを強制的に更新する

2023-10-21 17:55:43

質問

WinForms で、UI スレッドから強制的に即時 UI 更新を行うにはどうすればよいですか。

私がやっていることは、おおよそ

label.Text = "Please Wait..."
try 
{
    SomewhatLongRunningOperation(); 
}
catch(Exception e)
{
    label.Text = "Error: " + e.Message;
    return;
}
label.Text = "Success!";

操作前にラベルテキストが "お待ちください..." に設定されない。

操作のために別のスレッドを使用して解決しましたが、毛むくじゃらになってしまうので、コードを簡略化したいと思います。

どのように解決するのですか?

最初は、OP がなぜまだ回答の 1 つに印を付けていないのか不思議に思いましたが、自分で試してみて、それでもうまくいかなかったので、もう少し掘り下げてみたところ、この問題には私が最初に想定したよりもはるかに多くのものがあることがわかりました。

同様の質問を読むことで、より良い理解を得ることができます。 なぜコントロールはプロセスの途中で更新/リフレッシュしないのですか?

最後に、念のためですが、以下のようにすると、ラベルを更新させることができました。

private void SetStatus(string status) 
{
    lblStatus.Text = status;
    lblStatus.Invalidate();
    lblStatus.Update();
    lblStatus.Refresh();
    Application.DoEvents();
}

しかし、私が理解したところでは、これはエレガントで正しいアプローチとは程遠いものです。これは、スレッドがどの程度ビジー状態であるかに応じて動作するかどうかが決まるハックです。