मैंने एक साधारण WPF एप्लिकेशन बनाया है और डिफ़ॉल्ट विंडो में एक बटन जोड़ा है। जब मैं बटन पर क्लिक करता हूं, एक अनुरूपित लंबी कामकाजी विधि (थ्रेड स्लीप (15000) का उपयोग करके अनुकरण किया जाता है। मैं ऑनलाइन उदाहरणों के बावजूद बटन को असीमित रूप से निष्पादित करने की कोशिश कर रहा हूं, बटन और पूरी विंडो लॉक जैसे ही मैं क्लिक करें और बनी हुई है इसलिए जब तक Thread.Sleep (...) खत्मयूआई थ्रेड ब्लॉक
कोई भी विचार क्यों यह हो रहा है
यहाँ कोड है:।?
private void button1_Click(object sender, RoutedEventArgs e)
{
DoSomeAsyncWork();
}
private void DoSomeAsyncWork()
{
System.Windows.Threading.Dispatcher.Run();
Thread thread = new System.Threading.Thread(
new System.Threading.ThreadStart(
delegate()
{
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => Thread.Sleep(15000)));
}
));
thread.Start();
}
मैं वास्तव में कुछ कोड है कि यह खुद धागा है की आवश्यकता है निष्पादित करने के लिए कोशिश कर रहा हूँ और जब मैं पहली प्रतिनिधि में सीधे कोड की इस पंक्ति जगह (यानी जहां Thread.Sleep है (15000)) मैं एक संदेश प्राप्त करें कि धागा वस्तुओं तक नहीं पहुंच सकता है। यह संदेश है: "कॉलिंग थ्रेड इस ऑब्जेक्ट तक नहीं पहुंच सकता है क्योंकि एक अलग धागा इसका मालिक है।" जाहिर है, यह एक आम मुद्दा है लेकिन पृष्ठभूमि कार्यकर्ता का उपयोग करने के मार्ग के बिना मैं इसे कैसे प्राप्त करने के लिए संघर्ष कर रहा हूं। तो जब मैंने दूसरा नेस्टेड BeginInvoke कॉल जोड़ा तो ऑब्जेक्ट पाया गया लेकिन यूआई अवरुद्ध है। – fin
तो मुझे लगता है कि, जो मैं खोज रहा हूं वह मेरे तर्क को डालने का एक तरीका है जिसे प्रतीत होता है कि एक नए पृष्ठभूमि थ्रेड पर यूआई थ्रेड तक पहुंच की आवश्यकता है। संक्षेप में, यूआई ऑब्जेक्ट्स तक पहुंच प्रदान करें लेकिन पृष्ठभूमि में एक अलग धागे पर चलें? – fin
@ फ़िनबार: आप "पहुंच प्रदान नहीं कर सकते"। यूआई ऑपरेशंस * यूआई थ्रेड में किया जाना चाहिए। हालांकि, आप क्या कर सकते हैं, यूआई ऑपरेशंस को छोटे बिट्स में विभाजित करना, पृष्ठभूमि थ्रेड में बड़ा लूप डालना और लूप के अंदर 'डिस्पैचर.बिनजिन इनवोक (... लघु यूआई ऑपरेशन ...)' को कॉल करना है। इससे यूआई को लंबे समय के बजाय कई बार अवरुद्ध किया जा सकता है। – Heinzi