在Parallel.ForEach时更新WPF GUi

本文关键字:WPF GUi 更新 Parallel ForEach | 更新日期: 2023-09-27 17:50:53

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

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

我想使用Parallel.ForEach,因为它停止执行,直到所有线程完成。这对于阻塞接口(因为使用应该等待)非常重要,并且for可以显示完成的消息。不好的是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是实时更新的,并且在继续之前等待线程池的执行时,您建议使用什么方法

在Parallel.ForEach时更新WPF GUi

不要在同一个线程中这样做。如果你需要用户等待,那么就使用一种机制,在UI上逻辑地停止交互(关掉它,在窗口顶部放一个带有工作动画的透明标签),并在循环之外做一些事情。只要你的线程阻塞,整个UI交互就会被阻塞。

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

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

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