मैं बाहरी घटक का उपयोग कर रहा हूं जो समय-समय पर कार्यकर्ता थ्रेड से ईवेंट शूट करता है। मेरे ईवेंट हैंडलर में मैं मुख्य थ्रेड पर कुछ विधि का आह्वान करने के लिए एक डिस्पैचर का उपयोग करता हूं। यह अच्छी तरह से काम करता है ...डेडलॉक जब कार्यकर्ता धागा मुख्य धागे पर कुछ कहने का प्रयास करता है
private void HandleXYZ(object sender, EventArgs e)
{
...
if(OnTrigger != null)
dispatcher.Invoke(OnTrigger, new TimeSpan(0, 0, 1), e);
}
हालांकि, जब कार्यक्रम बंद हो जाता है और बाहरी घटक निपटान() है, कार्यक्रम कभी कभी रुक जाता है (और केवल देखा है और कार्य प्रबंधक में मारा जा सकता है)।
जब मैं देख रहा हूं कि यह क्या हो रहा है ऐसा लगता है कि "घटक" मुख्य धागे पर लौटने की घटना का इंतजार कर रहा है (यह निपटान() विधि में रहता है), जबकि कार्यकर्ता थ्रेड प्रेषक के लिए आने का इंतजार कर रहा है मुख्य धागे के लिए उल्लिखित कॉल (यह प्रेषक में लटकती है। इन्वोक-लाइन)।
अभी के लिए मैंने Invoke में टाइमआउट जोड़कर शट डाउन समस्या हल की, जो काम करने लगता है लेकिन गलत लगता है। क्या ऐसा कुछ करने का क्लीनर तरीका है? क्या मैं मुख्य थ्रेड को बंद करने से पहले अन्य धागे से नौकरियों के लिए कुछ समय ले सकता हूं?
मैं "डिस्कनेक्ट" नीचे बंद से पहले घटना, की कोशिश की है, लेकिन वह मदद नहीं करता है, क्योंकि डिस्पैचर है (हो सकता है) पहले से ही इंतजार कर रहे हैं जब कार्यक्रम बंद करने के लिए शुरू करते हैं ...
पुनश्च: बाहरी घटक का अर्थ है कि मेरे पास स्रोत कोड तक पहुंच नहीं है ...
पैराग्राफ का उपयोग करें अगली बार – Shai
कोड पेस्ट करना एक बहुत – Vedran