कॉलिंग थ्रेड STA होना चाहिए, क्योंकि कई UI घटकों को इसकी आवश्यकता होती है


174

मैं http://www.codeproject.com/KB/IP/Facebook_API.aspx का उपयोग कर रहा हूं

मैं XAML को कॉल करने की कोशिश कर रहा हूं जो WPF का उपयोग करके बनाई गई है । लेकिन यह मुझे एक त्रुटि देता है:

कॉलिंग थ्रेड STA होना चाहिए, क्योंकि कई UI घटकों को इसकी आवश्यकता होती है।

मुझे नहीं पता क्या करना है। मैं यह करने की कोशिश कर रहा हूँ:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

लेकिन यह मुझे वह त्रुटि दे रहा है।

मैंने एक पृष्ठभूमि कार्यकर्ता जोड़ा:

static BackgroundWorker bw = new BackgroundWorker();

static void Main(string[] args)
{
    bw.DoWork += bw_DoWork;
    bw.RunWorkerAsync("Message to worker");
    Console.ReadLine();
}

static void bw_DoWork(object sender, DoWorkEventArgs e)
{
    // This is called on the worker thread
    FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

    Console.WriteLine(e.Argument);        // Writes "Message to worker"

    // Perform time-consuming task...
}

जवाबों:


222

से अपने कोड को लागू करने का प्रयास करें डिस्पैचर :

Application.Current.Dispatcher.Invoke((Action)delegate{
      // your code
});

हाँ, तुम लोगों ने मेरी जान बचाई !!
एलेक्स मैकमैन ने

11
यही असली जवाब है। आप इसके साथ WPF की विंडो मूर्खता पर हैक कर सकते हैं।
एंड्रयू

7
और इसी के साथ, यदि आप MVVMLight का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैंDispatcherHelper.CheckBeginInvokeOnUI(Action action)
टिमोथी

यह समस्या जटिल और निराश लग रही थी लेकिन यह शॉट वास्तव में अच्छा है! आपको बहुत - बहुत धन्यवाद !
काय ली

4
@ और यह मूर्खता नहीं है, आप बस पृष्ठभूमि थ्रेड से UI थ्रेड तक पहुंचने का प्रयास कर रहे हैं।
क्रस्टी

139

यदि आप मुख्य सूत्र से कॉल करते हैं, तो आपको मुख्य विधि में STAThread विशेषता को मुख्य विधि में जोड़ना होगा।

यदि आप एक अलग थ्रेड का उपयोग करते हैं, तो इसे STA (सिंगल-थ्रेडेड अपार्टमेंट) में होना चाहिए, जो कि बैकग्राउंड वर्कर थ्रेड्स के मामले में नहीं है। आपको धागा स्वयं बनाना होगा, जैसे:

Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);

t.Start();

थ्रेडक्रोक के साथ थ्रेडस्टार्ट का प्रतिनिधि होता है।


2
क्या यह (एसटीए का उपयोग करके) दुष्प्रभाव हो सकता है?
लुइस Rhys

10
STA होने का मुख्य दुष्परिणाम यह है कि एक साथ COM कॉलबैक को क्रमबद्ध किया जाता है। यदि आप COM कॉलबैक का उपयोग नहीं कर रहे हैं, तो यह मायने नहीं रखना चाहिए।
23

मेरी ज़िंदगी बचाई! WPF ऐप में इसका उपयोग करने में सक्षम था जो दो अलग-अलग ऐप के बीच एकीकरण के लिए एक स्थानीय एपीआई की मेजबानी करता था!
schizoid04

18

आप भी इसे आजमा सकते हैं

// create a thread  
Thread newWindowThread = new Thread(new ThreadStart(() =>  
{  
    // create and show the window
    FaxImageLoad obj = new FaxImageLoad(destination);  
    obj.Show();  

    // start the Dispatcher processing  
    System.Windows.Threading.Dispatcher.Run();  
}));  

// set the apartment state  
newWindowThread.SetApartmentState(ApartmentState.STA);  

// make the thread a background thread  
newWindowThread.IsBackground = true;  

// start the thread  
newWindowThread.Start();  

धन्यवाद। यह फॉर्म के बजाय Applicationcontext वर्ग का उपयोग करते समय मदद करेगा।
सद्दामबिनयेद

जब एक बटन क्लिक किया जाता है तो मैं एक नया रूप खोलता हूं जैसे मैं कई अन्य स्थानों पर करता हूं। किसी भी विचार क्यों केवल उन स्थानों में से एक इस त्रुटि को फेंक रहा है?
पॉल मैकार्थी

17

मुझे संदेह है कि आपको बैकग्राउंड थ्रेड से UI घटक पर कॉलबैक मिल रहा है। मेरा सुझाव है कि आप बैकग्राउंडर का उपयोग करके उस कॉल को करें क्योंकि यह UI थ्रेड अवगत है।

BackgroundWorker के लिए, मुख्य कार्यक्रम को [STAThread] के रूप में चिह्नित किया जाना चाहिए।


1
मैंने इसे ऊपर के रूप में जोड़ने की कोशिश की, लेकिन यह अभी भी मुझे त्रुटि देता है: /
C ..

मैं कोड के साथ पारिवारिक नहीं हूं। क्या आप इसके माध्यम से डिबग कर सकते हैं और पता कर सकते हैं कि यह किस कारण से कोड की रेखा है?
प्रीत संघ

3

बस अपने कार्यक्रम को [STAThread]विशेषता के साथ चिह्नित करें और त्रुटि दूर हो जाती है! यह जादू है :)


1

मेरे लिए, एक नल पैरामीटर पास होने के कारण यह त्रुटि हुई। परिवर्तनशील मानों की जाँच किए बिना कोड को बदलने के लिए मेरे मुद्दे को तय किया। मैंने बैकग्राउंडवॉकर का इस्तेमाल किया।


-3

यदि आप किसी मौजूदा थ्रेड में एक नई विंडो UI स्टेटमेंट कहते हैं, तो यह एक त्रुटि फेंकता है। इसके बजाय मुख्य धागे के अंदर एक नया धागा बनाएं और नए बच्चे के धागे में विंडो यूआई स्टेटमेंट लिखें।


pls कैसे समझाएं?
तुषार गुप्ता - curioustushar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.