首页 >后端开发 >C++ >如何从单独的后台线程安全地更新 WPF UI?

如何从单独的后台线程安全地更新 WPF UI?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-06 02:51:40730浏览

How to Safely Update a WPF UI from a Separate Background Thread?

如何从另一个类中运行的另一个线程更新 UI

问题陈述:

在多线程 WPF 中应用程序中,需要从在单独的类中运行的后台线程更新 UI。目标是在执行冗长的计算时保持 UI 响应。

使用事件调度的解决方案:

  1. 从后台线程调度: 在后台线程中,使用 Dispatcher.Invoke 在 UI 线程上执行委托。这种方法允许您直接从其他线程进行 UI 更新。
  2. 在 UI 类中处理调度: 在 UI 类中注册一个事件处理程序以接收 UI 更新请求。在事件处理程序中,使用 Invoke 操作来更新 UI。

示例代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void startCalc(object sender, RoutedEventArgs e)
    {
        inputValues input = new inputValues();

        calcClass calculations = new calcClass();

        try
        {
            // Parse user inputs
        }
        catch
        {
            // Handle input errors
        }

        // Register event handler
        calculations.ProgressUpdate += OnProgressUpdate;

        // Start background calculations
        Thread calcthread = new Thread(
            new ParameterizedThreadStart(calculations.testMethod));
        calcthread.Start(input);
    }

    private void OnProgressUpdate(object sender, YourEventArgs args)
    {
        Dispatcher.Invoke((Action)delegate()
        {
            // Update UI based on event arguments
        });
    }
}

public class calcClass
{
    public event EventHandler<YourEventArgs> ProgressUpdate;

    public void testmethod(inputValues input)
    {
        for (int i = 0; i < 1000; i++)
        {
            // Perform calculations

            // Raise ProgressUpdate event when needed
            if (ProgressUpdate != null)
                ProgressUpdate(this, new YourEventArgs(status));

            Thread.Sleep(10);
        }
    }
}

事件调度的优点:

  • 易于实施
  • 允许精确控制 UI 更新
  • 保持 UI 和非 UI 代码的清晰分离

以上是如何从单独的后台线程安全地更新 WPF UI?的详细内容。更多信息请关注PHP中文网其他相关文章!

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