Parallel.For更新文本块

时间:2011-01-30 02:37:44

标签: wpf user-interface parallel-processing updating

我正在尝试从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);
           }
       });

3 个答案:

答案 0 :(得分:1)

Parallel.For调用本身就是在你的UI线程上进行的,阻止该线程更新,直到调用返回。这样做:

    Task.Create(delegate   
    {   
       Parallel.For( /* your current code */ );
    });   

对于这种情况,BackgroundWorker类可能是更合适的解决方案......

参考:http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/38d7a436-e1d1-4af8-8525-791ebeed9663

答案 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 .....
    }
}));