1

я могу сделать следующее внутри моего класса ViewModel:Использование Parallel.ForEach с диспетчером WPF ... как вы можете заставить этих двух играть хорошо друг с другом?

var inc = 100.0d/total; 

Parallel.ForEach(enumeration, new ParallelOptions { MaxDegreeOfParallelism = 8 }, 
    item => 
    { 
     //Do Parallel Tasks 

     lock (ProgressLock) 
     { 
      WorkProgress += inc; //This raises a PropertyChanged event (binding). 
     } 
    }); 

Что у меня возникают проблемы, делая получает каждую параллельную задачу быть UI отзывчивым. Любая помощь будет отличной. Благодаря!

+0

не ли 'lock' в параллельной задаче. Вместо этого используйте 'AsParallel.Sum()'. – SLaks

+0

Что означает «каждая параллельная задача, отвечающая требованиям пользовательского интерфейса»? – SLaks

+0

Я хочу, чтобы мое приложение использовало параллельные процессоры, а также имело возможность использовать диспетчер интерфейса WPF. Я хочу, чтобы фактические задачи, которые я делаю, были в теме пользовательского интерфейса. –

ответ

0

Вы не можете использовать многопоточность, а также оставаться на одном потоке.

Вместо этого вы можете использовать диспетчер для вызова средства настройки свойств в потоке пользовательского интерфейса.

1

Вы не можете запустить Parallel.ForEach в потоке диспетчера. Он будет блокировать поток до тех пор, пока весь процесс не завершится, и в это время ваши привязки будут обновляться.

Если вам необходимо обновить привязки, как это выполняется, вы можете перенести весь процесс в фоновое задание. Пока WorkProgress - простое число, привязка должна вести себя как свойство, если оно задано в фоновом потоке.

Это может быть столь же просто, как:

Task.Factory.StartNew(() => 
{ 
    Parallel.ForEach(enumeration, new ParallelOptions { MaxDegreeOfParallelism = 8 }, 
    item => 
    { 
    //Do Parallel Tasks 

    lock (ProgressLock) 
    { 
     WorkProgress += inc; //This raises a PropertyChanged event (binding). 
    } 
    }); 
}); 
+0

Разве это не победит цель параллельных задач? В принципе, нужно ли мне выбирать один или другой (поток пользовательского интерфейса или параллельный поток)? –

+0

@ m-y № «Параллель» предназначен для запуска МНОГО вещей в то же время *. Вы не можете выполнять несколько действий в одном потоке (поток пользовательского интерфейса). Это приведет к тому, что все операции будут выполняться симулятивно, а не блокировать поток пользовательского интерфейса. –

Смежные вопросы