首页 >后端开发 >C++ >如何从不同类中的单独线程更新 WPF UI?

如何从不同类中的单独线程更新 WPF UI?

DDD
DDD原创
2025-01-05 18:57:43456浏览

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

从不同类中的单独线程更新 UI

问:如何从在单独类中运行的工作线程更新 WPF UI?

A: 从不同的版本更新 UI thread:

  1. 使用 Dispatcher.Invoke: 在工作类中调用此方法来更新主线程上的 UI 元素。
  2. 基于事件的通信:

    • 在工作类中创建事件以引发 UI 更新通知。
    • 在主窗口类中注册这些事件的处理程序。
    • 在事件处理程序中调度 UI 更新。

使用示例事件:

// 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 及更高版本中,您还可以使用 Task 的异步编程来以更干净、更高效的方式更新 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn