2010-10-06 18 views
11

मैं समांतर का उपयोग करने के लिए अपने प्रोग्राम को दोबारा कर रहा हूं। फॉरएच। इससे पहले, जब मैं लूप के लिए नियमित रूप से उपयोग कर रहा था, तो मैं डिस्पैचर का उपयोग करके एक WPF प्रगति पट्टी अपडेट कर रहा था, जिसमें सरणी आकार द्वारा वर्तमान सरणी अनुक्रमणिका को विभाजित करके% पूरा किया गया था। समानांतर फ़ोरैच लूप के साथ यह ठीक से प्रदर्शित नहीं होता है i.e.% क्षैतिज रूप से कूदता है, जिसकी अपेक्षा की जाती है।समानांतर का उपयोग करते समय प्रगति ट्रैक करें। फोरएच

मैं प्रत्येक लूप के समानांतर से एक WPF प्रगति पट्टी कैसे अपडेट कर सकता हूं ताकि मैं पूर्ण पुनरावृत्तियों की संख्या को ट्रैक कर सकूं?

उत्तर

9

SLaks से पता चलता है प्रगति बार वृद्धि कर देता है फोन करके यूआई धागा (करने के लिए एक संदेश पोस्ट करना चाहिए, तो आप सिर्फ बजाय प्रगति बार मूल्य को बढ़ा देना चाहिए इसे Parallel.For विधि से प्राप्त वर्तमान इंडेक्स पर सेट करना।

हालांकि, मैं प्रत्येक पुनरावृत्ति के साथ यूआई थ्रेड को संदेश भेजने से कुछ कम महंगी तरीके का उपयोग करने पर गंभीरता से विचार करना चाहूंगा। यदि आपके पास बड़ी संख्या में पुनरावृत्तियों हैं, फिर प्रत्येक पुनरावृत्ति के साथ एक संदेश भेजना काफी मांग हो सकता है। आप एक स्थानीय चर count घोषित कर सकते हैं डी समानांतर लूप के शरीर में सुरक्षित रूप से चर को बढ़ाने के लिए Interlocked.Increment का उपयोग करें।

  • तो फिर तुम केवल 10 पुनरावृत्तियों के बाद जीयूआई अद्यतन करने के लिए if (count % 10 == 0) // ... की तरह कुछ इस्तेमाल कर सकते हैं। (यह पूरी तरह से सही नहीं है, क्योंकि अन्य थ्रेड count को चेक करने से पहले अपडेट कर सकते हैं, लेकिन यदि यह केवल जीयूआई अधिसूचना के उद्देश्य के लिए है, तो इससे कोई फर्क नहीं पड़ता - आप निश्चित रूप से लूप बॉडी में lock का उपयोग नहीं करना चाहते हैं)।

  • वैकल्पिक रूप से, आप एक टाइमर बना सकते हैं जो GUI थ्रेड से count के मान को बार-बार जांचता है और प्रगति पट्टी को अपडेट करता है। यह शायद और भी आसान है और आप गारंटी दे सकते हैं कि प्रगति पट्टी को अक्सर अपडेट किया जाएगा, लेकिन अधिक नहीं।

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