2011-08-29 15 views
7

पृष्ठभूमि थ्रेड पर किए जा रहे कार्यों के लिए एमवीवीएम व्यू मॉडल Progress संपत्ति को मैं कैसे संशोधित करूं?एमवीवीएम में पृष्ठभूमि थ्रेड प्रगति अधिसूचना?

मैं एक एमवीवीएम ऐप बना रहा हूं जो Task.Factory.StartNew() और Parallel.ForEach() का उपयोग करके पृष्ठभूमि थ्रेड पर एक कार्य निष्पादित कर रहा है। मैं एक गाइड के रूप में this article का उपयोग कर रहा हूँ। अब तक, मेरे कोड इस तरह दिखता है:

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

कहाँ fileList फ़ाइलों की एक सूची है संसाधित करने के लिए, और viewModelProgress संपत्ति के साथ दृश्य मॉडल है। DoWork() विधि, इस तरह दिखता है अब तक:

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

ProcessImage() विधि वास्तविक छवि प्रसंस्करण करता है। दृश्य मॉडल की Progress संपत्ति पृष्ठभूमि में प्रगति पट्टी से जुड़ी हुई है जो पृष्ठभूमि प्रक्रिया शुरू होने से ठीक पहले प्रदर्शित होती है।

मैं Parallel.ForEach() कथन के प्रत्येक पुनरावृत्ति के बाद दृश्य मॉडल Progress संपत्ति को अपडेट करना चाहता हूं। मुझे बस इतना करना है कि संपत्ति मूल्य में वृद्धि हुई है। मैं उसको कैसे करू? आपकी सहायता के लिए धन्यवाद.

+0

क्या 'प्रगति' सिर्फ एक int, float, या double है? –

उत्तर

7

चूंकि संपत्ति एक साधारण संपत्ति (और संग्रह नहीं है), इसलिए आप इसे सीधे सेट करने में सक्षम होना चाहिए। डब्ल्यूपीएफ स्वचालित रूप से यूआई थ्रेड पर मार्शलिंग को संभालेगा।

हालांकि, दौड़ की स्थिति से बचने के लिए, आपको स्पष्ट रूप से अपने "किए गए" काउंटर की वृद्धि को संभालने की आवश्यकता होगी। यह कुछ ऐसा हो सकता है:

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

और एक बार फिर, धन्यवाद रीड! मुझे यह बहुत कुछ कह रहा है! स्वीकृत और +1। –

संबंधित मुद्दे