2011-08-10 5 views
6

मैं डब्ल्यूपीएफ के साथ एक नौसिखिया हूं, मेरे आवेदन में मुझे प्रारंभिक चरणों की एक श्रृंखला करने की आवश्यकता है, इन्हें पूरा करने के लिए 10-15 सेकंड लगते हैं, जिसके दौरान मेरा यूआई उत्तरदायी नहीं होता है।क्या WPF में पृष्ठभूमि कार्यकर्ता का उपयोग करने का कोई विकल्प है?

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

अद्यतन:

यदि नहीं बहुत ज्यादा मुसीबत, तुम मेरे विकल्प का उपयोग करने के लिए एक उदाहरण पोस्ट कर सकते हैं? मेरे मामले के लिए, प्रोग्राम को ब्लूक्ल में डेटाबेस से कुछ मान प्राप्त होंगे।

+0

पृष्ठभूमि कार्यकर्ता के लिए, क्या आपने ReportProgress() को लागू किया था? http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.reportprogress.aspx –

+0

@ जोन रेनॉर वास्तव में –

+1

@ ऑस्कर: पृष्ठभूमिवर्कर: DoWork UI को उत्तरदायी नहीं बनाता है। शायद आप पृष्ठभूमि कार्यकर्ता Async पूर्ण घटना में कुछ यूआई अपडेट कर रहे हैं। यदि आप डेटाबेस से डेटा पुनर्प्राप्त करने के लिए केवल पृष्ठभूमि वर्कर का उपयोग करते हैं, तो इसे यूआई को ठंडा किए बिना काम करना चाहिए। – CharithJ

उत्तर

6

Dispatcher। डिस्पैचर एक विशिष्ट थ्रेड के लिए कार्य वस्तुओं की प्राथमिकता प्राप्त कतार बनाए रखता है। यह आपके यूआई को अपडेट करने में आपकी मदद कर सकता है। यदि आपके पास बहुत सारे UI संबंधित प्रारंभिकरण हैं, तो यह भी आपकी मदद करने में सक्षम नहीं होगा।

डिस्पैचर हमेशा पृष्ठभूमिवर्कर का विकल्प नहीं है। सबसे अच्छा अभ्यास आपकी आवश्यकता के अनुसार अधिक उपयुक्त एक का चयन करना है। उदाहरण के लिए यदि आप क्यूइंग पृष्ठभूमि वर्कर्स के बिना कुछ निष्पादित करना चाहते हैं तो समाधान है। दूसरी ओर यदि कतार में कोई समस्या नहीं है तो डिस्पैचर एक विकल्प है। उदाहरण के लिए, डिस्पैचर वर्तनी जांचकर्ताओं और सिंटैक्स हाइलाइटिंग कार्यक्षमता में उपयोग कर रहा है।

WPF Thread Model

सभी WPF अनुप्रयोगों दो महत्वपूर्ण सूत्र, प्रतिपादन के लिए एक और यूजर इंटरफेस के प्रबंधन के लिए एक साथ शुरू। प्रतिपादन थ्रेड पृष्ठभूमि में चलने वाला एक छिपा धागा है, इसलिए केवल धागा जिसे आप सामान्य रूप से सौदा करते हैं वह UI थ्रेड है। डब्ल्यूपीएफ को की आवश्यकता है कि इसकी अधिकांश वस्तुएं यूआई थ्रेड से बंधी होंगी। इसे थ्रेड एफ़िनिटी के रूप में जाना जाता है, जिसका अर्थ है कि आप केवल पर एक WPF ऑब्जेक्ट का उपयोग कर सकते हैं जिस पर इसे बनाया गया था। अन्य धागे पर इसका उपयोग करने से रनटाइम अपवाद फेंक दिया जाएगा। ध्यान दें कि WPF थ्रेडिंग मॉडल Win32®- आधारित API के साथ अच्छी तरह से इंटरऑपरेट करता है। इसका मतलब है कि डब्ल्यूपीएफ होस्ट या किसी भी एचडब्ल्यूएनडी-आधारित एपीआई (विंडोज फॉर्म, विजुअल बेसिक®, एमएफसी, या यहां तक ​​कि Win32) द्वारा होस्ट किया जा सकता है।

थ्रेड एफ़िनिटी को डिस्पैचर कक्षा द्वारा नियंत्रित किया जाता है, जो WPF अनुप्रयोगों के लिए प्राथमिकता संदेश लूप होता है। आम तौर पर आपके डब्ल्यूपीएफ परियोजनाओं में एक डिस्पैचर ऑब्जेक्ट होता है (और इसलिए एक एकल यूआई थ्रेड) कि सभी उपयोगकर्ता इंटरफ़ेस कार्य को चैनल के माध्यम से संचालित किया जाता है।

नोट:

डिस्पैचर और अन्य सूत्रण तरीकों के बीच मुख्य अंतर यह है कि डिस्पैचर वास्तव में मल्टी-थ्रेडेड नहीं है। डिस्पैचर नियंत्रण को नियंत्रित करता है, जिसे ठीक से काम करने के लिए एक थ्रेड की आवश्यकता होती है; बाद में निष्पादन (प्राथमिकता आदि के आधार पर) के लिए डिस्पैचर कतार घटनाओं की BeginInvoke विधि, लेकिन फिर भी एक ही थ्रेड पर।

अधिक जानकारी के लिए this धागा देखें।

0

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

0

कोई एसिंक्रोनस प्रतिनिधि का उपयोग कर सकता है।

http://msdn.microsoft.com/en-us/library/ms228963.aspx

बस सुनिश्चित करें कि अगर आप किसी भी यूआई संबंधित अपडेट कर रहे हैं बनाने का उपयोग करें:

Dispatcher.CheckAccess() 

यहाँ एक सरल उदाहरण:

private void HandleUIButtons() 
{  
    if (!btnSplit.Dispatcher.CheckAccess()) 
    {   
     //if here - we are on a different non-UI thread   
     btnSplit.Dispatcher.BeginInvoke(new Action(HandleUIButtons));  
    }  
    else   
    { 
     btnSplit.IsEnabled = true; //this is ultimately run on the UI-thread 
    } 
} 

यहाँ से लिया:

http://blog.clauskonrad.net/2009/03/wpf-invokerequired-dispatchercheckacces.html

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