ホームページ > バックエンド開発 > C++ > 長時間実行されるデータベース操作に BackgroundWorkers を使用するときに UI のフリーズを防ぐにはどうすればよいですか?

長時間実行されるデータベース操作に BackgroundWorkers を使用するときに UI のフリーズを防ぐにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-09 19:01:43
オリジナル
398 人が閲覧しました

How to Prevent UI Freezes When Using BackgroundWorkers for Long-Running Database Operations?

BackgroundWorkers による長時間のデータベース操作中の UI フリーズへの対処

問題:

データベース操作が長時間実行されると、メイン アプリケーション ウィンドウがフリーズし、進行状況バーが応答しなくなる可能性があります。これは、データベース タスクがメイン UI スレッドをブロックするために発生します。

BackgroundWorkers とマルチスレッド:

BackgroundWorker クラスは、時間のかかるタスクを別のスレッドにオフロードし、UI の応答性を維持することで解決策を提供します。 ただし、このバックグラウンド スレッドから UI の更新を正しく管理することが重要です。

UI を安全に更新する:

UI 要素を変更するには、メインスレッドのディスパッチャーを使用する必要があります。 バックグラウンド スレッドから UI コントロールを直接更新するのは安全ではなく、エラーが発生します。

解決策:

フリーズの問題を解決するには、プログレスバーの更新専用の BackgroundWorker を使用します。これにより、データベース操作ワーカーが分離され、競合が防止されます。

コードの実装:

MainWindow.xaml: データベース操作の BackgroundWorker.

内で進行状況バーを直接更新しようとする試みを削除します。

専用のプログレス バー ワーカー: プログレス バーの更新を管理する新しいクラスを作成します:

<code class="language-csharp">public class ProgressBarWorker
{
    private ProgressBar progressBar;
    private BackgroundWorker worker;

    public ProgressBarWorker(ProgressBar progressBar)
    {
        this.progressBar = progressBar;
        worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += Work;
        worker.ProgressChanged += ProgressChanged; // Added ProgressChanged handler
    }

    public void Run()
    {
        worker.RunWorkerAsync();
    }

    private void Work(object sender, DoWorkEventArgs e)
    {
        // Simulate long-running work; replace with your database operation
        for (int i = 0; i < 100; i++)
        {
            Thread.Sleep(100); // Simulate work
            worker.ReportProgress(i); // Report progress to the main thread
        }
    }

    private void ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar.Value = e.ProgressPercentage; // Update progress bar on main thread
    }
}</code>
ログイン後にコピー

MainWindow コード (例): UserControl_Loaded イベントで、ProgressBarWorker:

を初期化して開始します。
<code class="language-csharp">ProgressBarWorker progressBarWorker = new ProgressBarWorker(progressBar);
progressBarWorker.Run();</code>
ログイン後にコピー

利点:

  • データベース操作中の UI の応答性を維持します。
  • 進行状況バーの正確な更新を有効にします。
  • フリーズした UI を排除し、ユーザー エクスペリエンスを向上させます。

以上が長時間実行されるデータベース操作に BackgroundWorkers を使用するときに UI のフリーズを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート