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

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

我最近开始在WPF编程并遇到了以下问题。我不明白如何使用该Dispatcher.Invoke()方法。我有线程经验,我做了一些简单的Windows窗体程序,我只是使用了它

Control.CheckForIllegalCrossThreadCalls = false;

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

事实上,我正在制作一个WPF应用程序,它在后台检索数据,我开始一个新的线程来调用数据(从网络服务器),现在我想在我的WPF表单上显示它。问题是,我不能从这个线程设置任何控制。甚至没有标签或任何东西。怎么解决这个问题?



慕后森
浏览 2228回答 3
3回答

慕慕森

japf已正确回答。如果您正在查看多行操作,可以按如下方式编写。Application.Current.Dispatcher.BeginInvoke(   DispatcherPriority.Background,   new Action(() => {      this.progressBar.Value = 50;   }));想要了解性能的其他用户的信息:如果您的代码需要为高性能编写,您可以首先使用CheckAccess标志检查是否需要调用。if(Application.Current.Dispatcher.CheckAccess()){     this.progressBar.Value = 50;}else{     Application.Current.Dispatcher.BeginInvoke(       DispatcherPriority.Background,       new Action(() => {          this.progressBar.Value = 50;       }));}请注意,方法CheckAccess()在Visual Studio 2015中是隐藏的,因此只需编写它而不需要智能感知来显示它。请注意,CheckAccess的性能开销(开销只有几纳秒)。只有当您想要不惜任何代价保存执行“调用”所需的微秒时,才会更好。此外,当调用方法确定它是否在UI线程中时,总是有选项可以创建两个方法(on with invoke,and other without)。当您应该关注调度员的这个方面时,这是罕见的罕见情况。

哔哔one

当一个线程正在执行并且您想要执行被当前线程阻塞的主UI线程时,请使用以下命令:当前线程:Dispatcher.CurrentDispatcher.Invoke(MethodName,     new object[] { parameter1, parameter2 }); // if passing 2 parameters to method.主UI线程:Application.Current.Dispatcher.BeginInvoke(     DispatcherPriority.Background, new Action(() => MethodName(parameter)));
打开App,查看更多内容
随时随地看视频慕课网APP