我正在尝试从Parallel.For中更新WPF文本块,但我不能。我使用调度员,但我想,我做错了。所有工作首先完成,然后文本块迭代且快速地更新。这是我的代码:
Parallel.For(0, currentScene.Textures.Count, delegate(int i)
{
TextureObject texture = (currentScene.Textures[i]);
MainWindow.Instance.StatusBarText.Dispatcher.BeginInvoke(new Action(()
=> MainWindow.Instance.StatusBarText.Text = "Loading Texture " + i
+ " - " + texture.Name ), null);
LoadTexture(texture);
}
});
答案 0 :(得分:1)
Parallel.For调用本身就是在你的UI线程上进行的,阻止该线程更新,直到调用返回。这样做:
Task.Create(delegate
{
Parallel.For( /* your current code */ );
});
对于这种情况,BackgroundWorker类可能是更合适的解决方案......
答案 1 :(得分:0)
罗伯特是对的,但这是我写的方式:
Enumerable.Range(0, currentScene.Textures.Count).Select(i =>
new Task(() => {
TextureObject texture = (currentScene.Textures[i]);
MainWindow.Instance.Dispatcher.BeginInvoke(new Action(()
=> MainWindow.Instance.StatusBarText.Text = "Loading Texture " + i
+ " - " + texture.Name ), null);
LoadTexture(texture);
});
).Run(x => x.Start());
无需创建任务,其唯一的工作就是等待其他任务。
答案 2 :(得分:0)
正如Levy先生所指出的,对Parallel.For()的任何调用都将是一个阻塞调用,直到所有的循环迭代都完成。因此,您可以执行上面建议的操作,或者只是将调用包装在后台线程中。
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object arg)
{
Parallel.For(0, currentScene.Textures.Count, delegate(int i)
{
// The rest of your code .....
}
}));