2008-09-25 27 views
13

सिस्टम। अविश्वसनीय अपवाद अपवाद: ड्रैगड्रॉप पंजीकरण सफल नहीं हुआ। ---> सिस्टम। थ्रेडिंग। थ्रेडस्टेट अपवाद:ड्रैगड्रॉप पंजीकरण सफल नहीं हुआ

इस अपवाद का क्या अर्थ है? मैं इसे इस लाइन क्रम में एक पैनल के लिए एक पैनल जोड़ने की कोशिश कर में मिलता है ...

splitReport.Panel1.Controls.Add(ChartPanel); 

में VS2008 सी # कार्य

उत्तर

33

यह अपवाद का मतलब है कि धागा है कि पैनल का मालिक (पैनल जोड़ा जा रहा है) एमटीए थ्रेडिंग मॉडल का उपयोग शुरू किया गया है। ड्रैग/ड्रॉप सिस्टम के लिए आवश्यक है कि कॉलिंग थ्रेड एसटीए थ्रेड मॉडल का उपयोग करे (विशेष रूप से यह आवश्यक है कि COM को OleInitialize के माध्यम से प्रारंभ किया जाए)। थ्रेडिंग मॉडल COM के एक दुर्भाग्यपूर्ण निहित हैं, जो .NET प्लेटफॉर्म के पूर्ववर्ती हैं।

आप अपने मुख्य समारोह पर [STAThread] विशेषता है, तो मुख्य कार्यक्रम धागा पहले से ही जाँच की जानी चाहिए। सबसे संभावित स्पष्टीकरण, तो, यह है कि यह अपवाद एक अलग धागे पर हो रहा है। अपवाद होने पर दृश्य स्टूडियो (डीबग | विंडोज | थ्रेड) में थ्रेड विंडो को देखें और देखें कि क्या आप मुख्य थ्रेड के अलावा किसी थ्रेड पर हैं या नहीं।

Thread.CurrentThread.SetApartmentState(ApartmentState.STA)

: आप कर रहे हैं, समाधान शायद, कि नया थ्रेड के लिए धागा मॉडल की स्थापना जो आप इस प्रकार कर सकते हैं के रूप में सरल है (धागा जहां नियंत्रण बनाया जा रहा है के लिए इस कोड को जोड़ने) (Thread और ApartmentStateSystem.Threading के सदस्य हैं)

कोड होता है इससे पहले कि आप वास्तव में नए धागा शुरू की आवश्यकता होगी कि। जैसा कि @ टॉमर द्वारा नोट किया गया है, आप [STAThread] विशेषता का उपयोग करके इसे घोषणात्मक रूप से निर्दिष्ट भी कर सकते हैं।

आप पाते हैं कि अपवाद मुख्य थ्रेड पर होने वाला है तो वापस पोस्ट और हमें बताएँ, और शायद हम और अधिक कर सकते हैं। अपवाद के समय एक स्टैक ट्रेस समस्या को ट्रैक करने में मदद कर सकता है।

+2

आप इसे मैन्युअल की स्थापना के साथ उपद्रव नहीं करना चाहते हैं, तो आप कर सकते हैं भी धागा पद्धति पर [STAThread] विशेषता डाल दिया। –

2

मुझे यकीन है कि आप इस समस्या का समाधान है या नहीं है कि क्या नहीं कर रहा हूँ। मुझे बस इस समस्या का सामना करना पड़ा और मैंने इसे deleting my bin directory द्वारा तय किया।

+0

हटाया जा रहा है बिन निर्देशिका खुला परियोजना त्रुटियों संकलन –

2

हाँ, मुझे पता है इस सवाल के 2 और एक आधे साल पहले कहा गया था। मैंने इस अपवाद को मारा और कुछ पढ़ा। मैंने इसे सही किया, लेकिन कहीं भी मेरा समाधान नहीं देखा, इसलिए मैंने सोचा कि मैं इसे कहीं और पोस्ट कर सकता हूं और कोई और पढ़ सकता है। Main() पर चिह्नित [STAThread] साथ हो रहा के लिए

एक संभावना यदि आप एक आप पर शुरू के अलावा किसी अन्य धागे पर इस चला रहे है।

मैं बस जब बना सकते हैं और एक BackgroundWorker.DoWork विधि में एक नया रूप दिखाने की कोशिश इस अपवाद में फंस गयी। इसे ठीक करने के लिए, मैंने अपने नए फॉर्म को एक विधि में सृजन और दिखाया, और फिर उस विधि पर Invoke कहा जाता है ताकि इसे यूआई थ्रेड पर निकाल दिया जा सके। यह काम किया क्योंकि यूआई धागा [STAThread] चिह्नित साथ Main() विधि से शुरू के रूप में अन्य जवाब यहां की व्याख्या की।

4
function abc 
{ 
      Thread t = new Thread(new ThreadStart(xyz)); 
      t.SetApartmentState(ApartmentState.STA); 
      t.Start();  
} 
function xyz 
{ 
the code of Windows form..or whatever which is causing the error 
} 
+0

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/269b8950-2ef9-483f-8124-e2725ffd5d83/ –

0

मैं इस स्थिति हाल ही में सामना करना पड़ा, [STAThreadAttribute] मेरे मामले में है, और मैं, यह आप लोगों के लिए उपयोगी हो सकता है, तो मैं एक छोटे से कोड स्निपेट के साथ साझा आह्वान विधि का उपयोग कर इस समस्या का समाधान:

this.Invoke(new InvokeHandler(delegate() 
{ 
//Your method here! 
})); 

और InvokeHandler इस तरह एक प्रतिनिधि है:

private delegate void InvokeHandler(); 
1

अब तक सबसे आसान तरीका है:

private void DoSomethingOnGui() 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke((MethodInvoker)delegate 
     { 
      Safe_DoSomethingOnGui(); 
     }); 
    } 
    else 
    { 
     Safe_DoSomethingOnGui(); 
    } 
} 
private void Safe_DoSomethingOnGui() 
{ 
    // Do whatever you want with the GUI 
} 

तुम भी कोई समस्या नहीं के साथ चीजों को पारित कर सकते हैं:

private void DoSomethingOnGui(object o) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke((MethodInvoker)delegate 
     { 
      Safe_DoSomethingOnGui(o); 
     }); 
    } 
    else 
    { 
     Safe_DoSomethingOnGui(o); 
    } 
} 
private void Safe_DoSomethingOnGui(object o) 
{ 
    // Do whatever you want with the GUI and o 
} 
0

मैं यह त्रुटि पाया, और मैं देख रहा हूँ जब, एक और धागा MessageBox.Show(this, ...) कॉलिंग का उपयोग करके जहां यह नहीं है एक है कि यह दिखाया बना रही है कि किया प्रारंभ।

हम त्रुटि को दूर करने के लिए संदेश बॉक्स के मालिक को दूर करने की जरूरत है।

0

मैंने नीचे कोड का उपयोग करके इस त्रुटि को हल किया ... मैं पृष्ठभूमि कार्यकर्ता का उपयोग कर रहा था और पृष्ठभूमि कार्यकर्ता के दौरान यूआई तक पहुंचने का प्रयास कर रहा था .. यही कारण है कि त्रुटि हो रही है - ड्रैगड्रॉप पंजीकरण सफल नहीं हुआ। हम पृष्ठभूमि कार्यकर्ता में या धागे में चल रहे कोड से यूआई का उपयोग नहीं कर सकते हैं।

BeginInvoke((MethodInvoker)delegate 
{ 
//write your code here... 

}); 

धन्यवाद मुबारक कोडिंग ...:

2

मुख्य विधि पर STAThreadAttribute विशेषता जोड़ें। यह विशेषता आवश्यक संबंधित यदि आपके प्रोग्राम का उपयोग OLE काम करता है, क्लिपबोर्ड वर्ग की तरह करता है।

[STAThread]

static void मुख्य (स्ट्रिंग [] args)

{

}

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