ホームページ > バックエンド開発 > C++ > 別のクラスの別のスレッドから WPF UI を更新するにはどうすればよいですか?

別のクラスの別のスレッドから WPF UI を更新するにはどうすればよいですか?

DDD
リリース: 2025-01-05 18:57:43
オリジナル
424 人が閲覧しました

How to Update a WPF UI from a Separate Thread in a Different Class?

別のクラスの別のスレッドから UI を更新する

Q: 別のクラスで実行されているワーカー スレッドから WPF UI を更新するにはどうすればよいですか?

A: 別のから UI を更新するにはthread:

  1. Use Dispatcher.Invoke: ワーカー クラス内でこのメソッドを呼び出して、メイン スレッドの UI 要素を更新します。
  2. イベントベース通信:

    • ワーカー クラスでイベントを作成して、UI 更新の通知を生成します。
    • これらのイベントのハンドラーをメイン ウィンドウ クラスに登録します。
    • イベント内で UI 更新をディスパッチするhandlers.

イベントの使用例:

// Main window class
private void startCalc(object sender, RoutedEventArgs e)
{
    // Create a new worker class instance
    CalcClass calc = new CalcClass();
    
    // Register event handler to receive UI update notifications
    calc.ProgressUpdate += (s, e) =>
    {
        Dispatcher.Invoke((Action)(() => { /* Update UI here */ }));
    };
    
    // Start the worker thread
    Thread calcThread = new Thread(new ParameterizedThreadStart(calc.TestMethod));
    calcThread.Start(input);
}

// Worker class
public class CalcClass
{
    public event EventHandler ProgressUpdate;

    public void TestMethod(object input)
    {
        // Perform calculations
        
        // Raise event to notify UI update
        if (ProgressUpdate != null)
            ProgressUpdate(this, new EventArgs());
    }
}
ログイン後にコピー

補足:

を使用した代替解決策タスク:
.NET 4.5 以降では、タスクで非同期プログラミングを使用して、よりクリーンで効率的な方法で UI を更新することもできます。

タスクを使用してコードを更新しました:

// Main window class
private async void buttonDoCalc_Clicked(object sender, EventArgs e)
{
    // Create a new worker class instance
    CalcClass calc = new CalcClass();
    
    // Start the asynchronous calculation
    await calc.CalcAsync();
}

// Worker class
public class CalcClass
{
    public async Task CalcAsync()
    {
        // Perform calculations
        
        // Update UI using Dispatcher.Invoke
        Dispatcher.Invoke((Action)(() => { /* Update UI here */ }));
    }
}
ログイン後にコピー

以上が別のクラスの別のスレッドから WPF UI を更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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