0

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

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

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

这种方式有效,但它只在最后更新 Gui。

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

这种方式有效,但它不会等到 ThreadPool 结束。

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

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

4

1 回答 1

3

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

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

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

I use a GUI framework that handles that automatically via bound method signatures (telling the UI this method call is async, then the routine is automatically called in a separate thread).

于 2013-01-06T18:10:52.780 回答