在 WPF 应用程序中,您想要更新 UI 元素(例如、进度条、文本块)在属于不同类的后台线程中运行的冗长计算期间。但是,您不确定如何应对这一挑战,因为传统方法已被证明无效。
最有效的解决方案涉及利用事件和调度程序。其实现方式如下:
计算类中的事件声明:
在负责计算的类中(例如, calcClass),声明一个事件来通知 UI 进度更新:
public event EventHandler<EventArgs<YourStatus>> ProgressUpdate;
主班活动报名:
在主班UI类(例如MainWindow),注册到ProgressUpdate event:
calcClass.ProgressUpdate += (s, e) => { Dispatcher.Invoke((Action)delegate() { /* Update UI */ }); };
计算中的事件触发类:
计算方法内,必要时触发ProgressUpdate事件:
//part 1 if(ProgressUpdate != null) ProgressUpdate(this, new YourStatus(status)); //part 2
虽然事件和调度程序通常是首选,您也可以使用BackgroundWorker组件:
主类中的Worker创建和事件处理:
var worker = new BackgroundWorker(); worker.DoWork += (s, e) => { /* Perform calculations */ }; worker.ProgressChanged += (s, e) => { /* Update UI with progress */ }; worker.RunWorkerCompleted += (s, e) => { /* Finalize UI updates */ };
在计算中后台开始计算类:
worker.RunWorkerAsync(input);
请记住,与BackgroundWorker相比,使用事件和调度程序可以提供更多的控制和灵活性。
通过应用通过这些技术,您可以从后台线程高效地更新 UI 元素,确保响应能力和无缝的用户交互。
以上是如何从单独类中的后台线程安全地更新 WPF UI?的详细内容。更多信息请关注PHP中文网其他相关文章!