मैंने एक नए एप्लिकेशन में एक साधारण परीक्षण विधि बनाई जिसे कॉल किया जाता है जब मैं अपने मुख्य रूप पर (केवल) बटन पर क्लिक करता हूं। विधि इस प्रकार है:
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(() =>
{
Window1 window = new Window1();
window.Closed += (s, a) => window.Dispatcher.InvokeShutdown();
window.Show();
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
Window1
एक विंडो वर्ग मुझे लगता है कि लेकिन एक भी TextBlock
इस पर कुछ भी नहीं है बनाया है। मैं जितनी बार चाहूं उतनी बार उस बटन पर क्लिक कर सकता हूं, और यह बिना किसी समस्या के नई विंडो खोलना जारी रखता है (भले ही मैं पहले पिछले को बंद करता हूं या नहीं)।
मुझे संदेह है कि यह समस्या कोड में हो रही है कि आप हमें कहीं नहीं दिखा रहे हैं। आपको बहुत सावधान रहना होगा कि आपके नए धागे पर कुछ भी आपके मुख्य धागे से संबंधित यूआई तक पहुंचने का प्रयास नहीं करता है। अलग-अलग धागे पर चल रहे विंडोज एक-दूसरे के साथ संवाद नहीं कर सकते हैं जब तक वे दूसरे धागे के प्रेषक के माध्यम से नहीं जाते। आप जिस अपवाद को देख रहे हैं उसे फेंक दिया जाता है जब ऑब्जेक्ट बनाने वाले किसी अन्य के अलावा डिस्पैटर ऑब्जेक्ट की किसी विधि या प्रॉपर्टी को थ्रेड से एक्सेस किया जाता है।
एक कदम पीछे लेना, यह क्यों महत्वपूर्ण है कि नई खिड़की अपने धागे पर हो? जब तक नई खिड़की धागे का एकाधिकार करने जा रही है, तो यह संभवतः मुख्य धागे पर ठीक से चलती है। यदि आप कुछ लंबे अवरुद्ध ऑपरेशन चला रहे हैं, तो शायद उस ऑपरेशन को पूरी खिड़की के बजाए धागे में ले जाया जाना चाहिए। मुझे नहीं पता कि आप वास्तव में क्या कर रहे हैं, लेकिन यह सोचने के लिए कुछ है।
संपादित करें: यह महसूस करते हुए कि आप एक विशिष्ट WPF आवेदन में न चल रहा हो (लगता है कि आप किसी Office प्लगइन में हो सकता है), मैं शुरू करने के लिए खिड़कियां पूरी तरह से अपने स्वयं के धागे पर स्वसंपूर्ण अपने परीक्षण अपडेट किया गया। हालांकि, मैं अभी भी बिना किसी समस्या के दो पंक्तियों को लॉन्च करने में सक्षम हूं।
मेरा नया परीक्षण यहां है। यह विधि और परीक्षण वर्ग Window1
मेरे आवेदन की पूरी तरह से हैं।
[STAThread]
public static int Main(string[] args)
{
ThreadStart threadFunc =() =>
{
Window1 window = new Window1();
window.Closed += (s, a) => window.Dispatcher.InvokeShutdown();
window.Show();
System.Windows.Threading.Dispatcher.Run();
};
Thread thread = new Thread(threadFunc);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
thread = new Thread(threadFunc);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
return 0;
}
तो, तुम क्या करने कोशिश कर रहे हैं के साथ स्वाभाविक कुछ भी गलत नहीं प्रतीत होता है, और न ही मैं अपने कोड में किसी भी स्पष्ट मुद्दा दिख रहा है। मुझे संदेह है कि कुछ कस्टम क्रॉस-थ्रेड संचार आपके कस्टम विंडो में कहीं भी हो रहा है जबकि यह दिखाया जा रहा है। (या तो, या आप Office plugins के लिए विशिष्ट समस्या में चल रहे हैं।)
आप इस विंडो को दिखाने के लिए एक नया धागा क्यों बनाना चाहते हैं? यह आम तौर पर एक अच्छा विचार नहीं है। और, दूसरी बात, मैंने यह कोशिश की है और यह ठीक काम करता है (सिवाय इसके कि मुझे नहीं पता कि 'लॉग इन चेक' क्या करता है)। अपवाद कहां होता है? –
सभी यूआई संबंधित कोड मुख्य धागे में चलाना चाहिए। आप यहां क्या हासिल करने की कोशिश कर रहे हैं? – almulo
आम तौर पर यह त्रुटि आपको उस थ्रेड से आपके पहले फॉर्म पर किसी संपत्ति तक पहुंचने का प्रयास करने का संदर्भ देती है। हमें वास्तव में देखना होगा कि इस मुद्दे के कारण दूसरे फॉर्म पर क्या होता है। – DoomVroom