2010-11-15 14 views
12
में इस आवश्यकता

मेरे परिदृश्य:बुला धागा, एसटीए होना चाहिए, क्योंकि कई UI घटक WPF

void Installer1_AfterInstall(object sender, InstallEventArgs e) 
    { 
     try 
     {   

       MainWindow ObjMain = new MainWindow();    
       ObjMain.Show();    
     } 
     catch (Exception ex) 
     { 
      Log.Write(ex); 
     } 
    } 

मैं त्रुटि मिली "बुला धागा एसटीए होना चाहिए, क्योंकि कई UI घटक इस की आवश्यकता होती है"

मैं क्या करूं?

उत्तर

24

आम तौर पर, WPF के लिए धागे के लिए प्रवेश बिंदु विधि ThreadMethod के लिए [STAThreadAttribute] सेट है, या जब धागा Thread.SetApartmentState() का उपयोग कर बनाने फ्लैट राज्य जाँच करने के लिए निर्धारित किया है। हालांकि, यह धागा शुरू होने से पहले ही सेट किया जा सकता है।

आप धागा आप से इस कार्य प्रदर्शन कर रहे हैं के आवेदन के प्रवेश बिंदु से इस विशेषता को लागू नहीं कर सकते हैं, तो निम्न प्रयास करें:

void Installer1_AfterInstall(object sender, InstallEventArgs e) 
{ 
    var thread = new Thread(new ThreadStart(DisplayFormThread)); 

    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 
    thread.Join(); 
} 

private void DisplayFormThread() 
{ 
    try 
    { 
     MainWindow ObjMain = new MainWindow(); 
     ObjMain.Show(); 
     ObjMain.Closed += (s, e) => System.Windows.Threading.Dispatcher.ExitAllFrames(); 

     System.Windows.Threading.Dispatcher.Run(); 
    } 
    catch (Exception ex) 
    { 
     Log.Write(ex); 
    } 
} 
+1

[STAThreadAttribute] निजी शून्य DisplayFormThread()) देखें {{ MainWindow ObjMain = नए MainWindow कोशिश (; ObjMain.Show(); } पकड़ (अपवाद पूर्व) { Log.Write (पूर्व); } } – anbuselvan

+0

क्षमा करें, मुझे आपकी टिप्पणी समझ में नहीं आ रही है। 'STAThreadAttribute' को 'STATHread' तक छोटा किया जा सकता है; वह समर्थित है। क्या यही मतलब है तुम्हारा? –

+0

यह काम नहीं करता है, [STAThread] केवल प्रोग्राम एंट्री पॉइंट (मुख्य) पर पहचाना जाता है। इसके बजाय Thread.SetApartmentState() का उपयोग करें। आपको एक संदेश लूप भी चलाने की आवश्यकता होगी, एप्लिकेशन। रुन()। –

4

मैंने पहले कि त्रुटि थी और आसान तरीका Dispatcher उपयोग कर रहा है।
मेरी Question और answer

गुड लक

+0

कृपया मुझे बताएं कि यह उत्तर क्यों बुरा है, यह समाधान –

+0

समाधान के लिए मेरा प्राकृतिक वृत्ति था, आपको यह पूछना चाहिए कि किसने मतदान किया है! – Rev

+0

हां, लेकिन मैं ऐसा नहीं कर सकता हूं कि मैंने इस खुले पोस्ट को किसी को भी आमंत्रित किया है जो जानता है कि इस समाधान के साथ क्या गलत है –

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