2009-06-24 34 views
6

WinForms में, आपके पास Control.BeginInvoke() है, जिसका अर्थ है कि आप पृष्ठभूमि थ्रेड से मुख्य UI थ्रेड पर कॉल को मार्शल कर सकते हैं जिसने नियंत्रण के हैंडल को बनाया है।मार्शल मैन्युअल रूप से

यह ठीक है, लेकिन कैसे (सी # में) आप दो "मानक" धागे के बीच ऐसा करेंगे?

मैंने एक सेवा बस लिखी है, जिसमें संदेशों का उपभोग करने के लिए प्रोसेसर थ्रेड है। मैं टाइमर को आग लगाना चाहता हूं, जो कि प्रोसेसर थ्रेड को टाइमर के धागे में चल रहे कोड के बजाए कुछ करने का कारण बनता है।

बेशक मैं थ्रेड सिंक्रनाइज़ेशन (Monitor/using() {...}) का उपयोग कर सकता हूं लेकिन आश्चर्य हुआ कि यह सामान्य रूप से कैसे किया जाता था।

उत्तर

11

दुर्भाग्यवश उत्तर यहां देना मुश्किल है क्योंकि यह धागे की प्रकृति पर अत्यधिक निर्भर है।

धागे के बीच मार्शलिंग जादू नहीं है। एक अंतर्निहित तंत्र है जो इसे करना संभव बनाता है। उदाहरण के लिए WinForms में, Control.Invoke शैली फ़ंक्शन संदेश पासिंग के माध्यम से काम करते हैं। यूआई थ्रेड पर एक संदेश पोस्ट किया गया है, संदेश पंप अंततः इस संदेश को पंप करेगा और इसे मार्शल कॉल में परिवर्तित करेगा।

मानक धागे के बीच एक कॉल मार्शल करने के लिए, इसमें कुछ क्षमता होनी चाहिए जिसके द्वारा यह एक मार्शल कॉल का पता लगाना चाहती है और फिर वह कॉल होता है। यह आमतौर पर किसी प्रकार के संदेश गुजरने से किया जाता है।

आईएमएचओ, ऐसा करने का सबसे मानक तरीका यह है कि आपका थ्रेड लागू हो, सिंक्रनाइज़ेशन कॉन्टेक्स्ट प्रदान करें और इंस्टॉल करें। धागे के बीच एक मार्शलिंग तंत्र को परिभाषित करने का यह एक और मानक तरीका है।

+1

सिंक्रनाइज़ेशन कॉन्टेक्स्ट वह उत्तर था जिसे मैं ढूंढ रहा था - धन्यवाद! –

1

विंडोज फॉर्म message loop चलाता है, यही कारण है कि आप सभी प्रकार के कार्यों के लिए यूआई थ्रेड पर मार्शल कर सकते हैं - यह बार-बार अपनी कतार में संदेशों को देखता है, जिसे थ्रेड सीमाओं में भेजा जा सकता है।

यदि आप इसे मैन्युअल रूप से करना चाहते हैं, तो या तो अपना स्वयं का संदेश लूप बनाएं (एक या अधिक धागे के लिए) या बहुत आसान, सिंक्रनाइज़ेशन प्राइमेटिव का उपयोग करें। इस स्थिति के लिए AutoResetEvent एक अपरिपक्व प्रतीत होता है। आपको सही बिंदुओं पर वास्तव में Set और WaitOne विधियों को कॉल करने की आवश्यकता है, वास्तव में (और पाठ्यक्रम के डेडलॉक्स से अवगत रहें)।

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