2012-03-31 6 views
7

मेरे डब्ल्यूपीएफ एप्लिकेशन में मैं कन्स्ट्रक्टर में Dispatcher.BeginInvoke का उपयोग कर सामग्री लोड कर रहा हूं। मेरा सवाल यह है कि यह यूआई थ्रेड को अवरुद्ध करेगा?Dispatcher.BeginInvoke और Task.Factory.StartNew

या Task.Factory.StartNew का उपयोग करना और फिर यूआई पर चीजों को प्रेषित करना बेहतर है ताकि एप्लिकेशन लोडिंग सामग्री प्रक्रिया समय के बावजूद पहले लोड हो जाए?

कौन सा बेहतर दृष्टिकोण है और क्यों?

उत्तर

20

वे दो बहुत अलग बातें करते हैं:

  • Task.Factory.StartNew कार्यक्रम एक थ्रेड पूल धागे पर निष्पादन के लिए एक प्रतिनिधि। वर्तमान थ्रेड इस कार्य (async) के परिणाम के इंतजार किए बिना दौड़ना जारी रखता है। आम तौर पर आप लंबे समय से चल रहे पृष्ठभूमि कार्य को जन्म देंगे ताकि यूआई बहुत लंबे समय तक अवरुद्ध न हो (न कि "जमे हुए")।

  • Dispatcher.BeginInvoke प्रेषक (UI) थ्रेड पर निष्पादन के लिए एक प्रतिनिधि को शेड्यूल करता है। आम तौर पर पृष्ठभूमि धागे पर निष्पादित कुछ ऑपरेशन के परिणामों के साथ कुछ UI नियंत्रणों को अद्यतन करने के लिए यह किया जाता है। अनिवार्य रूप से आप यहां यूआई अपडेट कर रहे हैं।

आप प्रश्न सीधे जवाब देने के लिए:

आप डिस्पैचर धागे पर लंबा संचालन शेड्यूल नहीं करना चाहिए, आम तौर पर आप केवल यहाँ यूआई नियंत्रण अपडेट करना चाहते हैं। प्रतिनिधि में कोड यूआई थ्रेड पर निष्पादित किया जाएगा, जो निष्पादन के समय के लिए अवरुद्ध है। अपने वर्तमान कोड में बस Thread.Sleep(10000) डालें (जिसे आप कन्स्ट्रक्टर से शेड्यूल करते हैं) और आप देखेंगे कि यूआई फ्रीज हो जाएगा। इसके लिए पृष्ठभूमि कार्य का उपयोग करें - या तो Task या पृष्ठभूमि कार्यकर्ता (दोनों थ्रेड पूल थ्रेड का उपयोग करेंगे) के साथ।

या यह बेहतर Task.Factory.StartNew उपयोग करने के लिए और फिर बातें भेजने यूआई पर वापस ताकि आवेदन पहले चाहे सामग्री लोड करने की प्रक्रिया में समय की लोड होगा है।

हाँ!

+0

उत्तर के लिए धन्यवाद, Dispatcher.BeginInvoke UI..in को मेरे ऐप को अवरुद्ध करेगा। लोड होने के दौरान मुझे कुछ सेवाओं को कॉल करने की आवश्यकता है और यदि सेवा बंद हो गई है तो यह यूआई को लटकाता है हालांकि मैंने डिस्पैचर.बिनजिन इनवोक का उपयोग किया है, इसलिए मेरा मूल प्रश्न इस मामले में प्रेषक या कार्य का उपयोग करना है? –

+2

यदि आप * पृष्ठभूमि * में कुछ चलाना चाहते हैं तो एक कार्य का उपयोग करें, यदि आप यूआई को परिणाम भेजना चाहते हैं तो 'Dispatcher.BeginInvoke' – BrokenGlass

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