【发布时间】: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