Dispatcher.CurrentDispatcher
(System.Windows.Threading
में) और Application.Current.Dispatcher
(System.Windows
में) के बीच अंतर क्या हैं?Dispatcher.CurrentDispatcher बनाम आवेदन। वर्तमान। डिस्पैचर
मेरे पेट मुझसे कहता है कि Application.Current.Dispatcher
कभी नहीं बदलेगा और, वर्तमान आवेदन में सभी धागे को वैश्विक है, जबकि Dispatcher.CurrentDispatcher
धागा जिसमें से यह कहा जाता था पर निर्भर करता है Dispatcher
का एक नया उदाहरण बना सकते हैं।
क्या यह सही है?
यदि यह है, तो मुख्य रूप से बहु-थ्रेडेड यूआई के लिए Dispatcher.CurrentDispatcher
का उद्देश्य है?
स्पष्टीकरण के लिए धन्यवाद, लेकिन इसका मतलब क्या है "यह तब तक कुछ नहीं करेगा जब तक कि आप डिस्पैचर.रुन को कॉल न करें"? मैंने एक गैर-यूआई थ्रेड से CurrentDispatcher का उपयोग किया है, और Invoke वास्तव में एक प्रतिनिधि को आह्वान करता है। क्या आपका मतलब है कि प्रतिनिधियों को बस कॉलिंग थ्रेड पर बुलाया जाएगा? – ken
@ken: 'Invoke' और दोस्तों को सामान्य रूप से "पैकेज" (मार्शल, अगर आप पसंद करते हैं) एक Win32 संदेश में एक विधि कॉल करें और इसे एक संदेश कतार में पोस्ट करें जिससे संदेश लूप (प्रेषक लूप) अंततः इसे निष्कर्ष निकालता है और निष्पादित करता है कहते हैं। चूंकि कोई प्रेषक लूप नहीं है (यदि आप उस लूप में थे * आपका * कोड नहीं चल रहा होगा) कॉल वास्तव में कभी नहीं होगा। तो मुझे लगता है कि 'Invoke' पहले चेक करता है यदि आप पहले से ही' CurrentDispatcher' थ्रेड में ऑप्टिमाइज़ेशन के रूप में हैं और यदि आप मार्शलिंग के बजाय स्पॉट पर कॉल निष्पादित कर रहे हैं। आप 'Thread.ManagedThreadId' को चेक करके इसे सत्यापित कर सकते हैं। – Jon
* आप अपने अन्य यूआई थ्रेड्स के स्वामित्व वाले नियंत्रणों पर संदेशों को पोस्ट करने के लिए इसका उपयोग नहीं कर पाएंगे। * तो, आपके औसत WPF एप्लिकेशन में कितने यूआई थ्रेड हैं? – Will