2010-06-18 21 views
12

क्या कोई मुझे बता सकता है कि Dispatcher का उपयोग कब करें और SynchronizationContext कक्षा का उपयोग कब करें?डिस्पैचर और सिंक्रनाइज़ेशन कॉन्टेक्स्ट क्लासेस

थोड़ी देर के लिए मैं पृष्ठभूमि थ्रेड से कार्यों को कतारबद्ध करने के लिए Dispatcher का उपयोग कर रहा हूं, फिर मैंने SynchronizationContext की खोज की।

उत्तर

16

AFAIK, जब WPF का उपयोग कर, SynchronizationContext.Current ऑब्जेक्ट प्रकार DispatcherSynchronizationContext जो वास्तव में डिस्पैचर वस्तु के आसपास सिर्फ एक आवरण और Post और Send तरीकों सिर्फ Dispatcher.BeginInvoke और Dispatcher.Invoke प्रतिनिधि है की है।

तो यदि आप SynchronizationContext का उपयोग करने का निर्णय लेते हैं तो भी मुझे लगता है कि आप दृश्यों के पीछे प्रेषक को कॉल करना समाप्त कर देते हैं।

इसके अलावा मुझे लगता है कि यह सिंक्रनाइज़ेशन कॉन्टेक्स्ट का उपयोग करने के लिए थोड़ा बोझिल है क्योंकि आपको अपने यूआई में कॉल करने के लिए आवश्यक सभी थ्रेडों के वर्तमान संदर्भ के संदर्भ को पास करना होगा।

+3

डाउनवोट क्यों? –

4
  1. जब आपका कोड कड़ाई से WPF के साथ मिलकर डिस्पैचर का उपयोग करें।

  2. जब आप 'संदर्भ' थ्रेड पर कुछ कतारबद्ध करने की आवश्यकता होती है तो AsyncOperationManager का उपयोग करें। यह विंडोज फॉर्म, एएसपी .NET और डब्ल्यूसीएफ अनुप्रयोगों के साथ भी काम करता है।

  3. सिंक्रनाइज़ेशन कॉन्टेक्स्ट का उपयोग करने से बचें। AsyncOperationManager आंतरिक रूप से इस तकनीक का उपयोग करता है।

+0

मुझे एहसास है कि आपने कुछ समय पहले यह जवाब लिखा है। फिर भी, यदि आप "संदर्भ" (UI) थ्रेड पर निष्पादन के लिए एक प्रतिनिधि को कतारबद्ध करने के लिए 'AsyncOperationManager' का उपयोग कैसे करें, तो एक ठोस उदाहरण प्रदान कर सकते हैं, तो मुझे बहुत दिलचस्पी होगी। मुझे पता है कि कैसे 'सिंक्रनाइज़ेशन कॉन्टेक्स्ट' काम करता है; लेकिन मैं यह नहीं समझ सकता कि कैसे 'AsyncOperation' काम करना चाहिए। (मुझे वर्तमान में धारणा है कि यह एक एसिंक्रोनस ऑपरेशन के राज्य और प्रगति का ट्रैक रखने के लिए "टोकन" की तरह है, लेकिन वास्तव में निष्पादन के लिए एक प्रतिनिधि को शेड्यूल करने में मदद नहीं करेगा।) – stakx

+1

AsyncOperationManager का उपयोग कैसे करें: http: // www .codeproject.com/KB/cpp/syncContextTutorial.aspx – jbe

+0

क्या होगा यदि आपको UI थ्रेड पर कुछ सिंक्रनाइज़ करने की आवश्यकता है? AsyncOperation में एक भेजें() विधि नहीं है लेकिन सिंक्रनाइज़ेशन कॉन्टेक्स्ट करता है। – Monstieur

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