为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕后森 2019-08-13 09:51:13
使用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)。当您应该关注调度员的这个方面时,这是罕见的罕见情况。


查看完整回答
反对 回复 2019-08-13
?
哔哔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)));


查看完整回答
反对 回复 2019-08-13
  • 3 回答
  • 0 关注
  • 2190 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信