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

मैं wpf Toolkit द्वारा प्रदान किए गए संदेशबॉक्स का उपयोग कर रहा हूं। और मुझे त्रुटि मिलती है

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

new Thread(new ThreadStart(delegate
{
    MessageBox.Show("Opeartion could not be completed. Please try again.","Error",MessageBoxButton.OK,MessageBoxImage.Error);
})).Start();

मैं इस मामले में अपार्टमेंटस्टेट कैसे सेट कर सकता हूं

संपादित करें: मैं डब्ल्यूपीएफ टूलकिट के संदेशबॉक्स नियंत्रण का उपयोग कर मॉडल मॉडल संदेश प्रदर्शित करने की कोशिश कर रहा हूं। अब तक मेरे पास कोड निम्नानुसार है:

void SomeFunction()
{
// calls to some UI, and processing and then

var th = new Thread(new ThreadStart(delegate
                                        {
                                           MessageBox.Show("Opeartion could not be completed. Please try again.",
                                                "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                                        }));

                                        th.SetApartmentState(ApartmentState.STA);
                                        th.Start();
                                    }
}
0
जोड़ा संपादित
विचारों: 1
कारण मैं एक नया धागा शुरू करना चाहता हूं क्योंकि संदेशबॉक्स मॉडल होना चाहिए।
जोड़ा लेखक xaria, स्रोत
एक संवाद बॉक्स दिखाने के लिए आप एक नया धागा क्यों शुरू करते हैं? अपने मौजूदा यूआई थ्रेड को सिग्नल करना बेहतर होगा और इसे दिखाएं। आपकी समस्या को स्वचालित रूप से भी हल करेंगे।
जोड़ा लेखक Jon, स्रोत
wpf में यह आवश्यक है "> stackoverflow.com/questions/4183622/…
जोड़ा लेखक Klaus78, स्रोत
@ जोन मैं पूरी तरह से सहमत हूं, संदेश बॉक्स को प्रदर्शित करने के लिए एक नया धागा स्पिन करने का बिल्कुल कोई कारण नहीं है। यहां तक ​​कि यदि यह एक संवाद था जो उस धागे को लॉक कर सकता है, तो भी मैं एक नया धागा सुझा नहीं सकता - मैं डिस्पैचर का उपयोग करने का सुझाव दूंगा।
जोड़ा लेखक erodewald, स्रोत

3 उत्तर

संपादित

According to MSDN There exists builtin modal MessageBox in wpf but if you want to use Modeless MessageBox then you have to create custom window and then show it. Creating, showing and and returning value from custom modeless MessageBox is not very tough. You can see this link

केवल संदेशबॉक्स के लिए अलग-अलग थ्रेड का उपयोग करना बुद्धिमान नहीं है। वैसे भी आप निम्नलिखित द्वारा एक अपार्टमेंट राज्य सेट कर सकते हैं ...

  Thread th = new Thread(new ThreadStart(delegate
  {
    MessageBox.Show("Opeartion could not be completed. Please try again.", "Error",MessageBoxButtons.OK,MessageBoxImage.Error);
  }));

  th.ApartmentState = ApartmentState.STA;
  th.Start();
0
जोड़ा
प्रलेखन का कहना है कि अपार्टमेंटस्टेट थ्रेड स्टार्ट से पहले सेट किया जाना चाहिए। तो इसका मतलब है कि मैं अनाम कार्य का उपयोग नहीं कर सकता?
जोड़ा लेखक xaria, स्रोत
मुझे अभी भी त्रुटि मिलती है: WindowsBase.dll में 'System.InvalidOperationException' प्रकार का एक अनचाहे अपवाद अतिरिक्त जानकारी: कॉलिंग थ्रेड इस ऑब्जेक्ट तक नहीं पहुंच सकता है क्योंकि एक अलग थ्रेड इसका मालिक है।
जोड़ा लेखक xaria, स्रोत
कृपया मेरा संपादन देखें
जोड़ा लेखक xaria, स्रोत
@ पल्लोब मैं इसे संदेशबॉक्स पर प्राप्त कर रहा हूं। शो स्टेटमेंट। मुझे लगता है कि आप System.Windows.MessageBox का उपयोग कर रहे हैं। मैं wpf टूलकिट संदेशबॉक्स का उपयोग करना चाहता हूं। क्या आपने इसके साथ प्रयास किया है?
जोड़ा लेखक xaria, स्रोत
शुरू करने से पहले @xaria आप अपार्टमेंट राज्य सेट कर सकते हैं। संपादित उत्तर की जांच करें
जोड़ा लेखक Md Kamruzzaman Sarker, स्रोत
@xaria आप किस वस्तु का उपयोग करते हैं? आपको विधि Invoker का उपयोग करने की आवश्यकता है। ऑब्जेक्ट और ऑब्जेक्ट (नियंत्रण) नाम और प्रकार तक पहुंचने के लिए आपके द्वारा लिखे गए कोड को दिखाएं।
जोड़ा लेखक Md Kamruzzaman Sarker, स्रोत
मैंने आपके द्वारा दिए गए कोड की जांच की है। इसमें कोई समस्या नहीं है। यह बिना किसी त्रुटि के मेरे चलाता है। क्या आप जानते हैं कि कोड की कौन सी पंक्ति त्रुटि देती है और फिर कोड की उस पंक्ति को देती है। मुझे लगता है कि यह कुछ यूआई, और प्रसंस्करण और फिर इस भाग//कॉल पर त्रुटि देता है
जोड़ा लेखक Md Kamruzzaman Sarker, स्रोत
@ कोडिंगबर्फील्ड: और वह अपना नया धागा एसटीए में कैसे बनाएगा?
जोड़ा लेखक Grzegorz W, स्रोत
याद रखें कि आप केवल प्रत्येक थ्रेड के लिए अपार्टमेंटस्टेट सेट कर सकते हैं। मैं इसे सेट करके सेट करूँगा: [STAThread] सार्वजनिक स्थैतिक शून्य मुख्य ()
जोड़ा लेखक CodingBarfield, स्रोत

यूजर इंटरफेस के फ्रेम की तरह, कई विंडोज फॉर्मों की तरह, डब्ल्यूपीएफ भी एक थ्रेडिंग मॉडल लगाता है, जिसका मतलब है कि आप केवल एक निर्दिष्ट व्युत्पन्न डिस्पैचर ऑब्जेक्ट थ्रेड तक पहुंच सकते हैं जो इसे बनाता है। विंडोज प्रपत्र नियंत्रण में इंटरफ़ेस ISynchronizeInvoke को लागू करता है, यह इंटरफ़ेस एक सामान्य थ्रेड सिंक्रनाइज़ेशन को लागू करने के लिए Invoke और BeginInvoke जैसे तरीकों का एक सेट दिखाता है जिसे हम किसी अन्य थ्रेड से नियंत्रण तक पहुंचने के लिए उपयोग कर सकते हैं। डब्ल्यूपीएफ में, हमारे पास भी ऐसी चीज है, लेकिन ये ऑपरेशन डिस्पैचर नामक कक्षा में शामिल हैं, डिस्पैचर डब्ल्यूपीएफ इस तरह के थ्रेड सिंक्रनाइज़ेशन मॉडल को अनुमति देने का तरीका है।

निम्नलिखित पाठक को संशोधित करने का एक उदाहरण है। टेक्स्ट गुण जब कॉलर एक अलग थ्रेड में है:

// Resets textbox text from another thread
textBox.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
{
    textBox.Text = "New text";
}));
0
जोड़ा
// enable unit test to mock a dispatcher
var dispatcher = Dispatcher.CurrentDispatcher;
if (Application.Current != null)
{
   //use the application dispatcher if running from the software
    dispatcher = Application.Current.Dispatcher;
}

if (dispatcher != null)
{
   //delegate the operation to UI thread.
    dispatcher.Invoke(
        delegate
        {
            MessageBox.Show("Opeartion could not be completed. Please try again.","Error",MessageBoxButton.OK,MessageBoxImage.Error);
        });
}
0
जोड़ा