एक संदेश लूप कोड का एक छोटा सा टुकड़ा होता है जो किसी भी मूल विंडोज प्रोग्राम में मौजूद होता है। यह लगभग इस तरह दिखता है:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
GetMessage () Win32 एपीआई विंडोज से एक संदेश को पुनः प्राप्त करता है। आपका कार्यक्रम आम तौर पर अपना 99.9% समय वहां बिताता है, विंडोज के लिए यह बताने के लिए इंतजार कर रहा है कि यह कुछ दिलचस्प हुआ। TranslMessage () एक हेल्पर फ़ंक्शन है जो कीबोर्ड संदेशों का अनुवाद करता है। DispatchMessage () सुनिश्चित करता है कि विंडो प्रक्रिया को संदेश के साथ कहा जाता है।
प्रत्येक GUI सक्षम .NET प्रोग्राम में एक संदेश लूप है, यह Application.Run () द्वारा शुरू किया गया है।
Office के लिए एक संदेश लूप की प्रासंगिकता COM से संबंधित है। ऑफिस प्रोग्राम COM- इनेबल्ड प्रोग्राम्स हैं, जो Microsoft.Office.Interop क्लासेस काम करते हैं। COM एक कोकलैस की ओर से थ्रेडिंग का ख्याल रखता है, यह सुनिश्चित करता है कि COM इंटरफ़ेस पर किए गए कॉल हमेशा सही थ्रेड से किए जाते हैं। अधिकांश COM वर्गों की रजिस्ट्री में एक रजिस्ट्री कुंजी है जो अपने थ्रेडिंगमॉडल की घोषणा करती है, अब तक सबसे आम लोगों (कार्यालय सहित) "अपार्टमेंट" का उपयोग करते हैं। जिसका मतलब है कि इंटरफ़ेस विधि को कॉल करने का एकमात्र सुरक्षित तरीका उसी ऑब्जेक्ट से कॉल करना है जिसने क्लास ऑब्जेक्ट बनाया है। या इसे दूसरे तरीके से रखने के लिए: अब तक अधिकांश COM कक्षाएं थ्रेड-सुरक्षित नहीं हैं।
हर COM सक्षम धागा एक COM अपार्टमेंट के अंतर्गत आता है। दो प्रकार के हैं, सिंगल थ्रेडेड अपार्टमेंट (एसटीए) और एक मल्टी थ्रेड अपार्टमेंट (एमटीए)। अपार्टमेंट थ्रेडेड COM क्लास को STA थ्रेड पर बनाया जाना चाहिए। आप इसे वापस .NET प्रोग्राम में देख सकते हैं, Windows फॉर्म या WPF प्रोग्राम के UI थ्रेड के प्रवेश बिंदु में [STAThread] विशेषता है। अन्य थ्रेड्स के लिए अपार्टमेंट मॉडल Thread.SetApartmentState () विधि द्वारा सेट किया गया है।
अगर UI थ्रेड STA नहीं है, तो विंडोज प्लंबिंग का बड़ा हिस्सा सही तरीके से काम नहीं करेगा। विशेष रूप से ड्रैग + ड्रॉप, क्लिपबोर्ड, ओपनफाइलडायलॉग जैसे विंडोज संवाद, वेबब्रोसर, स्क्रीन रीडर जैसे यूआई ऑटोमेशन ऐप को नियंत्रित करता है। और कई COM सर्वर, जैसे कार्यालय।
STA थ्रेड के लिए एक सख्त आवश्यकता यह है कि यह कभी भी ब्लॉक नहीं होना चाहिए और एक संदेश लूप को पंप करना चाहिए। संदेश लूप महत्वपूर्ण है, क्योंकि COM एक इंटरफ़ेस विधि को एक थ्रेड से दूसरे में कॉल करने के लिए COM का उपयोग करता है। हालाँकि .NET मैशलिंग कॉल को आसान बनाता है (Control.BeginInvoke या Dispatcher.BeginInvoke उदाहरण के लिए), यह वास्तव में बहुत मुश्किल काम है। थ्रेड जो कॉल निष्पादित करता है वह एक प्रसिद्ध स्थिति में होना चाहिए। आप केवल मनमाने ढंग से एक थ्रेड को बाधित नहीं कर सकते हैं और इसे एक विधि कॉल करने के लिए मजबूर कर सकते हैं, जिससे भयानक फिर से प्रवेश की समस्या पैदा होगी। एक धागा "निष्क्रिय" होना चाहिए, न कि किसी भी कोड को निष्पादित करने में व्यस्त होना चाहिए जो कार्यक्रम की स्थिति को बदल रहा है।
शायद आप देख सकते हैं कि कहां जाता है: हां, जब कोई प्रोग्राम मैसेज लूप निष्पादित कर रहा है, तो यह निष्क्रिय है। वास्तविक मार्शलिंग एक छिपी हुई खिड़की के माध्यम से होता है जिसे COM बनाता है, यह उस विंडो निष्पादन कोड की विंडो प्रक्रिया के लिए PostMessage का उपयोग करता है। STA थ्रेड पर। संदेश लूप सुनिश्चित करता है कि यह कोड चलता है।