2011-08-29 12 views
7

Jak zmodyfikować właściwość widoku MVVM modelu Progress dla pracy wykonywanej w wątku tła?Powiadomienie o postępach wątku w tle w MVVM?

Tworzę aplikację MVVM, która wykonuje zadanie w wątku tła, używając Task.Factory.StartNew() i Parallel.ForEach(). Używam jako przewodnika this article. Do tej pory mój kod wygląda następująco:

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

Gdzie fileList znajduje się lista plików, które mają być przetwarzane, a viewModel jest model widok z właściwością Progress. Metoda DoWork() wygląda tak, jak dotychczas:

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

metoda ProcessImage() robi rzeczywistego przetwarzania obrazu. Właściwość modelu widoku Progress jest powiązana z paskiem postępu w oknie dialogowym wyświetlanym tuż przed rozpoczęciem procesu w tle.

Chciałbym zaktualizować właściwość widoku modelu Progress po każdej iteracji instrukcji Parallel.ForEach(). Wszystko, co muszę zrobić, to zwiększyć wartość nieruchomości. Jak mogę to zrobić? Dzięki za pomoc.

+0

Czy "Postęp" to tylko int, float lub double? –

Odpowiedz

7

Ponieważ właściwość jest prostą właściwością (a nie kolekcją), powinieneś być w stanie ustawić ją bezpośrednio. WPF automatycznie obsłuży wątek z powrotem do wątku interfejsu użytkownika.

Jednak, aby uniknąć sytuacji wyścigowej, musisz wyraźnie zająć się inkrementowaniem "wykonanego" licznika. Może to być coś takiego:

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; 
     } 
} 
+0

I jeszcze raz, dzięki Reed! Wydaje mi się, że dużo mówię! Zaakceptowany i +1. –

Powiązane problemy