私は C# で WinForms ウィンドウを作成しています。このウィンドウには、それぞれ数百から数千の項目を持つ約 12 個ListBox
と 6 個のコントロールが表示されます。ComboBox
これらを設定するには少し時間がかかります。長い時間ではありません - ほんの数秒ですが、プログラムがバックグラウンドで動作していることを待っている間、ユーザーが何かを見ることができると便利です。
これが発生している間、一般的な「お待ちください」アニメーションの境界線のない一番上のウィンドウが表示されますが、アニメーションに問題があります。
少し時間がかかるほとんどのタスクでは、次の方法でこれを解決します。
Program.ShowPleaseWait(); // Show top-most animation
Thread t = new Thread(stuffToDo); // Run stuffToDo() in separate thread
t.Start();
While (t.IsAlive)
Application.DoEvents(); // Run message queue, necessary for animation
Program.HidePleaseWait(); // Hide top-most animation
そしてそれは非常にうまく機能します。ときどき、スレッド内のもので何かを呼び出す必要があり、アニメーションに小さな問題が発生することがありますが、通常は大した問題ではありません。
ただし、このフォームでは、スレッド内のコード全体が UI コードであり、ListBox と ComboBox を設定します。つまり、すべてを Invoke ブロックで囲む必要がありますが、そもそも別のスレッドで実行する意味がないため、意味がありません。
この特定のケースのワーカー スレッド全体を廃棄し、Application.DoEvents()
各ループに 100 ごとに挿入する以外に、コントロールが設定されている間、動作中のアニメーションを続行できるようにするためにできることはありますか?