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

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

DDD
发布: 2025-01-05 18:57:43
原创
411 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板