Параллельно. Для обновления текстового блока - PullRequest
2 голосов
/ 30 января 2011

Я пытаюсь обновить текстовый блок WPF из Parallel.For и не могу.Я использую диспетчер, но, думаю, я делаю это неправильно.Вся работа выполняется сначала, а затем текстовый блок обновляется итеративно и быстро.Вот мой код:

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 ]

1 голос
/ 30 января 2011

Сам вызов Parallel.For выполняется в потоке пользовательского интерфейса, блокируя его обновление до тех пор, пока вызов не будет возвращен.Сделайте это вместо этого:

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

Класс BackgroundWorker может быть более подходящим решением для этого сценария, хотя ...

Ссылка: http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/38d7a436-e1d1-4af8-8525-791ebeed9663

0 голосов
/ 31 января 2011

Как указывает г-н Леви, любой вызов Parallel.For () будет блокировать вызов до тех пор, пока не будут завершены все итерации цикла. Таким образом, вы можете сделать то, что было предложено выше, или просто обернуть вызов в фоновом потоке.

ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object arg)
{
    Parallel.For(0, currentScene.Textures.Count, delegate(int i)        
    {
        // The rest of your code .....
    }
}));
0 голосов
/ 30 января 2011

Роберт прав, но вот как я бы написал:

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());

Нет необходимости создавать Задачу, единственная задача которой - сидеть и ждать других Задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...