मुझे सी # में बहु थ्रेडिंग के साथ समस्या है। मैं किसी अन्य थ्रेड से किसी फ़ॉर्म में लेबल अपडेट करने के लिए किसी ईवेंट का उपयोग करता हूं, जिसके लिए मुझे निश्चित रूप से Invoke() कमांड का उपयोग करने की आवश्यकता होती है। वह हिस्सा भी ठीक काम कर रहा है। हालांकि, उपयोगकर्ता फॉर्म को बंद कर सकता है और यदि कोई दुर्भाग्यपूर्ण समय पर ईवेंट भेजा जाता है तो प्रोग्राम क्रैश हो सकता है।'डेडलॉक' केवल एक लॉक ऑब्जेक्ट के साथ?
तो, मैंने सोचा कि मैं बस फॉर्म की निपटान() विधि को ओवरराइड कर दूंगा, लॉक कोड के भीतर एक बुलियन को सच में सेट कर दूंगा, और उस बूलियन को भी जांचूंगा और लॉक कोड में ईवेंट का आह्वान करूंगा।
हालांकि, हर बार जब मैं फॉर्म बंद करता हूं तो प्रोग्राम पूरी तरह से जम जाता है।
यहाँ कोड का उल्लेख किया भागों हैं:
private object dispose_lock = new object();
private bool _disposed = false;
private void update(object sender, EventArgs e)
{
if (InvokeRequired)
{
EventHandler handler = new EventHandler(update);
lock (dispose_lock)
{
if (_disposed) return;
Invoke(handler); // this is where it crashes without using the lock
}
return;
}
label.Text = "blah";
}
protected override void Dispose(bool disposing)
{
eventfullObject.OnUpdate -= update;
lock (dispose_lock) // this is where it seems to freeze
{
_disposed = true; // this is never called
}
base.Dispose(disposing);
}
मुझे आशा है कि यहाँ किसी को भी किसी भी विचार है कि इस कोड के साथ गलत है। अग्रिम धन्यवाद!
असली आवेदन में एक अद्यतन कॉल विंडो निपटान करने के लिए पैदा कर सकता है? उस स्थिति में, पृष्ठभूमि थ्रेड में लॉक हो सकता है, और UI थ्रेड उसी ऑब्जेक्ट पर लॉकिंग का निपटान कर सकता है जिसमें बैकग्राउंड थ्रेड हो रहा है। –
आप कहां परिवर्तनीय InvokeRequired प्राप्त कर रहे हैं, इसे उस नियंत्रण पर बुलाया जाना चाहिए जिसे आप अपडेट करना चाहते हैं, यानी: यदि (लेबल। इन्वोकर आवश्यक) {//} – Lloyd