【问题标题】:Update WPF GUi while Parallel.ForEach在 Parallel.ForEach 时更新 WPF GUI
【发布时间】:2013-01-06 17:55:13
【问题描述】:

我有一个 WPF 多线程应用程序,每个线程都会更新绑定到 xaml gui 的对象的一些变量。

如果我使用普通线程或线程池,它工作正常。当对象变量被踏板改变时,每个对象都会在 GUI 中实时更新。

我想使用Parallel.ForEach,因为它会停止执行,直到所有线程都完成。这对我来说很重要,因为它阻止了界面(因为使用应该等待),并且可以显示完成的消息。不好的是,Parallel.Foreach 不会实时更新,只有在所有线程都完成时才更新。

这种方式可行,但它只会在最后更新 Gui。

Parallel.ForEach(Computers, new ParallelOptions { MaxDegreeOfParallelism = 1}, computer => { PingTemp(computer); });

这种方式可行,但它不会等到线程池结束。

Task.Factory.StartNew(() => Parallel.ForEach<Computer>(Computers, new ParallelOptions { MaxDegreeOfParallelism = 1 }, computer => PingTemp(computer)));

当 GUI 实时更新并等待线程池执行后再继续时,您推荐什么方法。

【问题讨论】:

  • 我很久没有使用 WPF,但我记得 WPF 窗口有一个叫做 Dispatcher 的东西,你可以使用它来修改来自其他线程的 UI,使用 BeginInfoke 方法传递匿名操作,如 () => { someControl. Text = "新文本"; }
  • @EOG 不起作用,因为 dispather 需要 UI 线程是空闲的(因为它分派到这个线程)并且他阻止了这个。

标签: c# .net wpf multithreading parallel-processing


【解决方案1】:

不要在同一个线程中这样做。如果您需要用户等待,请使用一种机制,您可以在逻辑上停止 UI 上的交互(如果为 ff,则在窗口顶部放置一个带有工作动画的透明标签)并在循环之外执行操作。只要您的线程阻塞,整个 UI 交互就会被阻塞。

当 UI 线程阻塞时,您不会在 UI 中获得任何更新。所以,这已经扼杀了你想要的。但更重要的是——你真的会做坏事。始终保持 UI 空闲。

我的旧规则是 0.1/1。超过 0.1 秒的所有内容都必须进入非 UI 线程,任何超过 1 秒的内容都必须禁用 UI 并显示工作动画,如果任何 mreans 可行,最好显示进度。

我使用一个 GUI 框架,它通过绑定的方法签名自动处理(告诉 UI 这个方法调用是异步的,然后在单独的线程中自动调用例程)。

【讨论】:

  • 我有一个指向可观察集合的数据网格,对象必须将计算机名称和结果字符串化。此应用程序执行 ping 操作并将结果保存在字符串结果中,该字符串结果是数据网格中的列绑定。我希望在结果出现时为每一行(每台机器)动态更新这个表。如果这不是正确的 Approch @TomTom,我应该怎么做?谢谢!
  • 我说的。让它在一个单独的线程中。在运行时阻止 UI。永远不要阻塞 UI 线程超过 0.1 秒。
  • 但是我想让用户在界面中实时看到进度。你能告诉我一个例子或一个链接,我可以找到更多信息吗?
  • “逻辑上阻止它”的哪一部分难以理解?我从来没有说过“让它不可见”。在顶部放置一个透明元素,“吞下所有用户交互。来吧,这是实习生的东西。禁用你现在不想要的所有用户交互,让其余的工作。
  • 无法理解。我可以使用这个codeproject.com/Articles/58836/Using-Background-Process-in-WPF 来完成这个。谢谢汤姆汤姆
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多