【问题标题】:Invoke a Control in WPF, C#在 WPF、C# 中调用控件
【发布时间】:2016-01-06 09:46:35
【问题描述】:

大家好,我正在将我的一个项目从 windowsforms 切换到 WPF。到目前为止,我使用这段代码使用来自另一个线程的数据调用我的 GUI 对象:

this.Invoke(new Action<NewDiagPacketArrivedEventArgs>(DoSomething), e);

如何在 WPF 中做同样的事情?我发现了一些关于使用调度程序的帖子,但我无法让它工作。我想要一个简单的解决方案。如果您知道有关此主题的任何指南,我将不胜感激。

谢谢

【问题讨论】:

标签: c# wpf thread-safety invoke


【解决方案1】:

试试这个

this.Dispatcher.Invoke(()=>DoStuffOnGUIThread());

DoStuffInGUIThread() 是包含要在 UI 线程上执行的代码的方法。

【讨论】:

  • 短变体this.Dispatcher.Invoke(DoStuffOnGUIThread);也可以吗?
  • 在这种情况下是的。但是不能加参数,就失去了闭包的优势。
  • 如果调用了许多调度程序,它们可能会在主线程处于活动状态时弄乱 UI,因此您应该添加 'DispatcherPriority.ContextIdle' 。它会立即更新 UI。
【解决方案2】:

在 Winforms 中,我们使用 Control.Invoke 将代码从其他线程编组到 GUI 线程。 在 WPF 的 Dispatcher.Invoke 中,每个 Dispatcher 对象都有自己的 Dispatcher,在该队列上它将被封送。

Dispatcher.BeginInvoke(new Action(() =>
 {
     //Your code
 }));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多