Я работаю над приложением MVVM, которое выполняет несколько задач в фоновом режиме, используя TPL.Задачи должны сообщать о прогрессе в пользовательский интерфейс, чтобы можно было обновлять диалог прогресса.Поскольку приложением является MVVM, диалоговое окно прогресса связано со свойством модели представления с именем Progress, которое обновляется методом модели представления с подписью UpdateProgress(int increment)
.Фоновые задачи должны вызывать этот метод для сообщения о прогрессе.
Я использую метод для обновления свойства, поскольку оно позволяет каждой задаче увеличивать свойство Progress на разные суммы.Итак, если у меня есть две задачи, и первая занимает в четыре раза больше времени, чем вторая, первая задача вызывает UpdateProgress(4)
, а вторая задача UpdateProgress(1)
.Итак, прогресс составляет 80%, когда первая задача завершается, и 100%, когда вторая задача завершается.
Мой вопрос действительно довольно прост: как мне вызвать метод модели представления из моих фоновых задач?Код ниже.Спасибо за вашу помощь.
В задачах используется Parallel.ForEach()
в коде, который выглядит следующим образом:
private void ResequenceFiles(IEnumerable<string> fileList, ProgressDialogViewModel viewModel)
{
// Wrap token source in a Parallel Options object
var loopOptions = new ParallelOptions();
loopOptions.CancellationToken = viewModel.TokenSource.Token;
// Process images in parallel
try
{
Parallel.ForEach(fileList, loopOptions, sourcePath =>
{
var fileName = Path.GetFileName(sourcePath);
if (fileName == null) throw new ArgumentException("File list contains a bad file path.");
var destPath = Path.Combine(m_ViewModel.DestFolder, fileName);
SetImageTimeAttributes(sourcePath, destPath);
// This statement isn't working
viewModel.IncrementProgressCounter(1);
});
}
catch (OperationCanceledException)
{
viewModel.ProgressMessage = "Image processing cancelled.";
}
}
Оператор viewModel.IncrementProgressCounter(1)
не вызывает исключение, ноэто не доходит до основного потока.Задачи вызываются из объектов MVVM ICommand
в коде, который выглядит следующим образом:
public void Execute(object parameter)
{
...
// Background Task #2: Resequence files
var secondTask = firstTask.ContinueWith(t => this.ResequenceFiles(fileList, progressDialogViewModel));
...
}