使用Dispatcher.Invoke从非主线程更改WPF控件我最近开始在WPF编程并遇到了以下问题。我不明白如何使用该Dispatcher.Invoke()方法。我有线程经验,我做了一些简单的Windows窗体程序,我只是使用了它Control.CheckForIllegalCrossThreadCalls = false;是的我知道这很蹩脚,但这些都是简单的监控应用程序。事实上,我正在制作一个WPF应用程序,它在后台检索数据,我开始一个新的线程来调用数据(从网络服务器),现在我想在我的WPF表单上显示它。问题是,我不能从这个线程设置任何控制。甚至没有标签或任何东西。怎么解决这个问题?
3 回答
慕慕森
TA贡献1856条经验 获得超17个赞
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
TA贡献1854条经验 获得超8个赞
当一个线程正在执行并且您想要执行被当前线程阻塞的主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)));
- 3 回答
- 0 关注
- 2227 浏览
添加回答
举报
0/150
提交
取消