小编典典

使用Dispatcher.Invoke从非主线程更改WPF控件

c#

我最近开始在WPF中编程,遇到了以下问题。我不知道如何使用该Dispatcher.Invoke()方法。我在线程方面有丰富的经验,我制作了一些简单的Windows
Forms程序,其中我只是使用了

Control.CheckForIllegalCrossThreadCalls = false;

是的,我知道这很la脚,但是这些都是简单的监视应用程序。

事实是,现在我正在制作一个WPF应用程序,该应用程序在后台检索数据,我启动了一个新线程来进行调用以检索数据(从Web服务器),现在我想在WPF表单上显示它。问题是,我无法从该线程设置任何控件。甚至没有标签或其他任何东西。如何解决?

答案评论:
@Jalfp: 因此,当我获得数据时,我在“新 踏步”中
使用了此Dispatcher方法吗?
还是让后台工作人员检索数据,将其放入字段中,然后启动一个新线程,等待该字段被填充,然后调用调度程序以将检索到的数据显示到控件中?


阅读 701

收藏
2020-05-19

共1个答案

小编典典

首先要了解的是,Dispatcher并非旨在运行长时间阻止操作(例如从WebServer检索数据…)。当您要运行将在UI线程上执行的操作(例如更新进度条的值)时,可以使用Dispatcher。

您可以做的是在后台工作程序中检索数据,并使用ReportProgress方法在UI线程中传播更改。

如果确实需要直接使用Dispatcher,则非常简单:

Application.Current.Dispatcher.BeginInvoke(
  DispatcherPriority.Background,
  new Action(() => this.progressBar.Value = 50));
2020-05-19