मेरे पास एक सी # लाइब्रेरी है जो "मुख्य" ui थ्रेड (यदि कोई मौजूद है) को भेजने/पोस्ट करने की क्षमता रखना चाहती है। इस पुस्तकालय द्वारा इस्तेमाल किया जा सकता है:लाइब्रेरी से मुख्य थ्रेड सिंक्रनाइज़ेशन कॉन्टेक्स्ट या डिस्पैचर को कैप्चर करना
- एक WinForms आवेदन
- स्थानीय ऐप्लिकेशन (यूआई) के साथ
- एक सांत्वना आवेदन (कोई UI के साथ)
पुस्तकालय मैं था में शुरुआतीकरण के दौरान कुछ (एक सिंक्रनाइज़ेशन कॉन्टेक्स्ट, एक डिस्पैचर, एक टास्क शेड्यूलर, या कुछ और) कैप्चर करना पसंद है, जो मुझे (बाद में) मुख्य थ्रेड पर भेजें/पोस्ट करने की अनुमति देगा (यदि मुख्य थ्रेड में वह क्षमता है- - यह एक संदेश पंप है)। उदाहरण के लिए, लाइब्रेरी मुख्य थ्रेड पर कुछ विनफॉर्म UI को रखना चाहती है, और केवल तभी जब मुख्य एप्लिकेशन में मुख्य धागे तक पहुंचने की क्षमता हो।
बातें मैं कोशिश की है:
- एक SynchronizationContext:। कैप्चरिंग यह एक Winforms आवेदन (एक WindowsFormsSynchronizationContextCurrent SynchronizationContext के रूप में स्थापित किया जाएगा के लिए ठीक काम करता है यह भी सांत्वना अनुप्रयोग के लिए ठीक काम करता है - के बाद से मैं पता लगा सकता हूं कि वर्तमान सिंक्रनाइज़ेशन कॉन्टेक्स्ट शून्य है (और इस प्रकार, मुझे पता है कि मेरे पास मुख्य थ्रेड पर काम भेजने/पोस्ट करने की क्षमता नहीं है)। यहां समस्या मूल यूआई एप्लीकेशन है: इसमें क्षमता है (यानी यह है एक संदेश पंप), लेकिन वर्तमान सिंक्रनाइज़ेशन संदर्भ शून्य है और इस प्रकार मैं इसे कंसोल ऐप केस से अलग नहीं कर सकता। अगर मैं अंतर कर सकता हूं, तो मैं बस मुख्य थ्रेड पर WindowsFormsSynchronizationContext इंस्टॉल करें, और मुझे जाना अच्छा लगता है।
- ए Dispatcher: Current का उपयोग करके इसे कैप्चर करना एक नया सिंक्रनाइज़ेशन कॉन्टेक्स्ट बनाता है। इस प्रकार, सभी परिस्थितियों में मैं एक डिस्पैचर वापस प्राप्त करूंगा। हालांकि, एक कंसोल ऐप के लिए, पृष्ठभूमि थ्रेड से
Dispatcher.Invoke
का उपयोग करके (अपेक्षित के रूप में) लटका होगा। मैंDispatcher.FromThread
का उपयोग कर सकता हूं (जो थ्रेड के लिए डिस्पैचर नहीं बनाता है यदि कोई अस्तित्व में नहीं है)। लेकिन मूल यूआई एप्लिकेशन इस विधि का उपयोग कर एक शून्य डिस्पैचर वापस करेगा, और फिर मैं फिर से, यूआई अनुप्रयोग को कंसोल एप्लिकेशन से अलग करने में सक्षम नहीं हूं। - ए TaskScheduler: मैं FromCurrentSynchronizationContext का उपयोग कर सकता था। सिंक्रनाइज़ेशन कॉन्टेक्स्ट के समान समस्याएं हैं। अर्थात। FromCurrentSyncronizationContext को कॉल करने से पहले, मुझे यह जांचना होगा कि वर्तमान सिंक्रनाइज़ेशन कॉन्टेक्स्ट शून्य है (जो कंसोल ऐप और मूल ui एप्लिकेशन के मामले में होगा)। तो, फिर मैं मूल UI अनुप्रयोग को कंसोल एप्लिकेशन से अलग नहीं कर सकता।
मैं, ज़ाहिर है, मेरी लाइब्रेरी के उपयोगकर्ता निर्दिष्ट किया जाए या नहीं यह एक यूआई आवेदन जब वे मेरी Initialize
विधि कॉल है हो सकता था, लेकिन मैं पुस्तकालय यदि संभव हो तो के उपयोगकर्ता के लिए कि जटिलता से बचने के लिए उम्मीद कर रही थी ।
मैं एमएफसी में सी # लाइब्रेरी का उपयोग कर रहा हूं। इस लाइब्रेरी को TaskScheduler.FromCurrentSynchronizationContext() कॉल मिला है। जब मैं एमएफसी एप्लिकेशन चलाता हूं तो यह अपवाद फेंकता है कि 'वर्तमान सिंक्रनाइज़ेशन कॉन्टेक्स्ट को टास्कशेड्यूलर के रूप में उपयोग नहीं किया जा सकता है।' कोई विचार यह कैसे निपटाना है?मैं सीधे एमएफसी में सी # लाइब्रेरी का उपयोग नहीं कर रहा हूं, लेकिन मैंने प्रबंधित सी ++ में एक रैपर बनाया है और मैं इस रैपर का उपयोग एमएफसी एप्लिकेशन में कर रहा हूं। –