Фоновое уведомление о продвижении потока в MVVM? - PullRequest
7 голосов
/ 30 августа 2011

Как изменить свойство модели представления MVVM Progress для работы, выполняемой в фоновом потоке?

Я создаю приложение MVVM, которое выполняет задачу в фоновом потоке, используя Task.Factory.StartNew() иParallel.ForEach().Я использую эту статью в качестве руководства.Пока что мой код выглядит так:

Task.Factory.StartNew(() => DoWork(fileList, viewModel));

Где fileList - это список файлов, которые нужно обработать, а viewModel - это модель представления со свойством Progress.Пока что метод DoWork() выглядит следующим образом:

private object DoWork(string[] fileList, ProgressDialogViewModel viewModel)
{
    Parallel.ForEach(fileList, imagePath => ProcessImage(imagePath));
}

Метод ProcessImage() выполняет фактическую обработку изображения.Свойство Progress модели представления связано с индикатором выполнения в диалоговом окне, которое отображается непосредственно перед началом фонового процесса.

Я хочу обновлять свойство Progress модели представления после каждой итерацииParallel.ForEach() заявление.Все, что мне нужно сделать, это увеличить значение свойства.Как я могу это сделать?Спасибо за вашу помощь.

1 Ответ

7 голосов
/ 30 августа 2011

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

Однако, чтобы избежать состояния гонки, вам нужно явно обработать увеличение вашего счетчика «сделано». Это может быть что-то вроде:

private object DoWork(string[] fileList, ProgressDialogViewModel viewModel)
{
    int done; // For proper synchronization
    Parallel.ForEach(fileList, 
       imagePath => 
       {
           ProcessImage(imagePath));
           Interlocked.Increment(ref done);
           viewModel.Progress = done;
       }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...