2009-04-24 7 views
6

मैं अपने मुख्य धागे पर कोड के एक अनुभाग को कैसे कार्यान्वित कर सकता हूं?मुख्य धागे पर कोड निष्पादन को मजबूर करना

यही कारण है कि मैं जानना चाहते हैं:

मैं एक कस्टम बनाया संदेश बॉक्स कि कभी-कभी एक धागा है कि मुख्य थ्रेड नहीं है से पता चला जाता है। हालांकि, जब संदेश बॉक्स कन्स्ट्रक्टर को कॉल किया जाता है तो मुझे एक अमान्यऑपरेशन अपवाद मिलता है, "कॉलिंग थ्रेड एसटीए होना चाहिए, क्योंकि कई यूआई घटकों को इसकी आवश्यकता होती है।" यह समझ में आता है, मुख्य थ्रेड पर UI तत्वों को संभालने की आवश्यकता है।

मेरा संदेशबॉक्स .ShowMessage (...) फ़ंक्शन एक स्थिर कार्य है जो मेरे कस्टम संदेश बॉक्स का उदाहरण बनाता है और इसे दिखाता है। क्या कोई ऐसा शो है जो मैं ShowMessage में डाल सकता हूं जो संदेश बॉक्स को बनाएगा और मुख्य धागे पर दिखाया जाएगा? मेरे कोड में कहीं और मैं इसी तरह के मुद्दों को संभालने के लिए Control.BeginInvoke का उपयोग करता हूं, लेकिन चूंकि यह एक स्थिर कार्य है क्योंकि BeginInvoke को कॉल करने के लिए मेरे पास पहले से मौजूद मौजूदा UI तत्व नहीं है।

क्या मुझे MessageBox.ShowMessage को नियंत्रण से कनेक्ट करना है। BginginInvoke? मैं ShowMessage (या कुछ समतुल्य) को ShowMessage के भीतर से बुलाया जाना पसंद करूंगा।

उत्तर

5

वहाँ कुछ ही विकल्प यहां हैं:

  • दूसरा धागा एसटीए बनाने (आप केवल अपने स्वयं के Thread के लिए ऐसा कर सकते हैं - ThreadPool धागे के लिए नहीं) - .SetApartmentState(ApartmentState.STA);
  • के माध्यम से देखते हैं SynchronizationContext.Current गैर है शून्य; अगर ऐसा है, का उपयोग Send/Post
  • एक ISynchronizeInvoke उदाहरण के रूप में में प्रपत्र/नियंत्रण पारित (WPF करने के लिए लागू नहीं हो सकता - मुझे यकीन है कि 100% नहीं कर रहा हूँ)
+0

क्या आपके पास एक लिंक है जो बताता है कि आपके द्वारा सूचीबद्ध पहले विकल्प को लागू करने के बारे में कैसे जाना है? थ्रेड शुरू करने से पहले – w4g3n3r

+0

कॉल थ्रेड .etApartmentState()। – itowlson

+0

थ्रेड बनाते समय, बस (संपादित) उत्तर में दिखाए गए अनुसार .etApartmentState को कॉल करें। अगर आपको पहले स्थान पर थ्रेड बनाने में अधिक सहायता की आवश्यकता है तो मुझे बताएं। –

5

आपकी सोच सही है - करने के लिए इसे ठीक से काम करने के लिए प्राप्त करें, आपको मुख्य धागे से इसे प्राप्त करने की आवश्यकता होगी।

सबसे आसान तरीका? जब आप अपना मुख्य फॉर्म प्रारंभ करते हैं, तो एक स्थिर चर में एक संदर्भ सहेजें जो आपके ShowMessage() कॉल पर दिखाई देता है। सीधे दिखा संदेश बॉक्स के बजाय

if(myForm.InvokeRequired) 
{ 
    myForm.Invoke(() => ShowMessage(arg1,arg2,arg3)); 
    return; 
} 
.... other code here.... 
+3

उसे वास्तव में एक स्पष्ट चर की आवश्यकता नहीं हो सकती है - डब्ल्यूपीएफ में वह WinForms में एप्लिकेशन.केंटरफॉर्म संग्रह से एप्लिकेशन.क्यूरेंट.माइनविंडो का उपयोग कर सकता है। – itowlson

1

, बस अपने मुख्य थ्रेड, जो एक संदेश बॉक्स प्रदर्शित करने के लिए मुख्य थ्रेड का संकेत करने के लिए एक संदेश भेजने: फिर, अपने ShowMessage मानक कर सकते हैं।

+0

+1 यह वास्तव में बहुत कम घुसपैठ आईएमओ – Rick

+0

है क्या आप इसका उदाहरण कैसे दे सकते हैं? – Brabbeldas

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