2010-04-17 9 views
12

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

मैं इस त्रुटि को कैसे हल करूं?

// using System.Threading; 
// using System.Windows.Threading; 
Thread Messagethread = new Thread(new ThreadStart(delegate() 
{ 
    DispatcherOperation DispacherOP = 
     frmMassenger.Dispatcher.BeginInvoke(
      DispatcherPriority.Normal, 
      new Action(delegate() 
      { 
       frmMassenger.Show(); 
      })); 
})); 
Messagethread.Start(); 
+1

मैं समस्या रूट पाया। मेरे पास एक टाइमर है जो प्रत्येक timer.tick में, नए संदेश की जांच करें और फिर प्रत्येक नया संदेश दिखाएं। टाइमर थ्रेड मेरे काम को इतना कठिन बनाते हैं। – Rev

+1

ऑफ-विषय: डब्ल्यूपीएफ में, विंडोज़ को केवल यही कहा जाता है: "विंडोज़"; नहीं "रूप"। उस बाद की अवधि का उपयोग अन्य यूआई ढांचे, विंडोज फॉर्म में किया जाता है। – stakx

+0

@stakx: धन्यवाद – Rev

उत्तर

9

बिल्कुल Dispatcher कुछ (विशिष्ट थ्रेड में) करने के लिए जब हम WPF में बहु सूत्रण के साथ काम एक ही रास्ता है!

लेकिन डिस्पैचर के साथ काम करने के लिए हम 2 बातें पता होना चाहिए: हम चाहिए call dispatcher in the main thread of app (कि धागा

  1. बहुत सारे रास्ते Dispatcher_Operation तरह डिस्पैचर उपयोग करने के लिए, [window.dispatcher] या आदि
  2. एसटीए धागा)

उदाहरण के लिए तो होना चाहिए है: अगर हम अन्य दिखाना चाहते विंडो [WPF] एक और धागा में, हम इस कोड का उपयोग कर सकते हैं:

Frmexample frmexample = new Frmexample(); 
      Frmexample .Dispatcher.BeginInvoke 
       (System.Windows.Threading.DispatcherPriority.Normal, 
       (Action)(() => 
       { 
        frmexample.Show(); 
        //---or do any thing you want with that form 
       } 
       )); 

युक्ति:Remember - we can't access any fields or properties from out dispatcher, so use that wisely

13

अपने धागा है कि आप जीयूआई तत्व शुरू करने के लिए, आप जाँच करने के लिए अपने सूत्र के अपार्टमेंट राज्य स्थापित करने की आवश्यकता कोशिश कर रहे हैं के लिए:

यह पॉप-अप विंडो बनाने के लिए मेरे कोड है से पहले आप इसे शुरू करते हैं।

उदाहरण:

myThread.SetApartmentState(ApartmentState.STA); 
myThread.Start(); 
+0

@Rev: मुझे बताएं, अगर यह आपकी त्रुटि से पहले नहीं मिलता है तो मुझे त्रुटि संदेश पता है और मैं आपको आवश्यक अतिरिक्त जानकारी प्रदान करूंगा। मुझे लगता है कि आपको बस इतना ही चाहिए। मदद के लिए –

+0

thx लेकिन यह काम नहीं करता है। यह समस्या Wpf और Threading से संबंधित है। मुझे लगता है कि हमें इसे हल करने के लिए डिस्पैचर का उपयोग करना चाहिए। रेव – Rev

+2

@Rev: शायद आपके पास 2 समस्याएं हैं। थ्रेडिंग एसटीए और प्रेषक। अगर आप प्रेषक के साथ मदद चाहते हैं तो मुझे बताएं और मैं आपको दिखा सकता हूं कि कैसे। –

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