バックグラウンド スレッド: 長時間にわたるタスク中の GUI の応答性の維持
この記事では、時間のかかる操作の実行中にグラフィカル ユーザー インターフェイス (GUI) の応答性を維持するという課題について説明します。 重要なのは、バックグラウンド スレッドを使用してメイン スレッドのブロックを防ぐことです。
連続ループ内で BackgroundWorker
を使用する最初の試みは、バックグラウンド スレッドの非 STA (シングル スレッド アパートメント) ステータスにより失敗しました。 ここで紹介するソリューションでは、単一の BackgroundWorker
と適切なイベント ハンドラーを使用して、この制限を克服します。
イベント駆動型の実装
改善されたアプローチには、BackgroundWorker
および DoWork
イベント ハンドラーで初期化される単一の ProgressChanged
インスタンスが含まれます。 RunWorkerAsync
が呼び出され、バックグラウンド タスクが開始されます。 DoWork
ハンドラーは時間のかかる操作を実行し、オプションで ReportProgress
メソッド経由で更新を送信します。 ProgressChanged
ハンドラーはメインスレッドで実行され、GUI を更新します。
<code>public class UpdateController { private BackgroundWorker _backgroundWorker; ... public UpdateController() { _backgroundWorker = new BackgroundWorker(); _backgroundWorker.DoWork += backgroundWorker_DoWork; _backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged; ... } public void Update() { _backgroundWorker.RunWorkerAsync(); } ... private void backgroundWorker_ProgressChanged... { _userController.UpdateUsersOnMap(); } ... }</code>
スケジュールされたアップデートの実装
GUI を一定の間隔 (10 秒ごとなど) で更新するには、Timer
を BackgroundWorker
と組み合わせます:
<code>public class UpdateController { private Timer _timer; ... public UpdateController() { _timer = new Timer(); _timer.Interval = 10000; // 10 seconds _timer.Elapsed += _timer_Elapsed; _timer.Start(); } private void _timer_Elapsed... { Update(); } ... }</code>
このアプローチにより、インターフェースの応答性を維持しながら、タイムリーな GUI 更新が保証されます。
以上がバックグラウンド スレッドは、長時間実行されるタスク中の GUI の応答性をどのように改善できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。