मैं ऐसे एप्लिकेशन का उपयोग कर रहा हूं जो मैन्युअल रीसेट इवेंट का उपयोग करके थ्रेड सिंक्रनाइज़ करता है। FxCop ने मुझे उन वस्तुओं का निपटान करने के लिए कहा। मैं निम्नलिखित चर्चा जो मुझे एक ही बताया पाया:मैन्युअल रीसेट इवेंट का निपटान कब किया जाना चाहिए?
Do I need to Dispose() or Close() an EventWaitHandle?
लेकिन मैं नहीं जानता कि जब एक ManualResetEvent का एक उदाहरण निपटान के लिए।
private void btn_Click(object sender, EventArgs e)
{
var mre = new ManualResetEvent(false);
new Thread(() => this.SetEvent(mre)).Start();
for (int i = 0; i < 10; ++i)
{
new Thread(() => this.WaitFor(mre)).Start();
}
}
private void SetEvent(ManualResetEvent manualResetEvent)
{
Thread.Sleep(10000);
manualResetEvent.Set();
}
private void WaitFor(ManualResetEvent manualResetEvent)
{
manualResetEvent.WaitOne();
}
समस्या यह है कि ManualResetEvent के कई उदाहरण मौजूद हैं और एक से अधिक थ्रेड प्रत्येक उदाहरण के लिए इंतजार कर रहे हैं है:
निम्नलिखित सरल कोड समस्या को दर्शाता है।
अगर मैं एक सूची में उदाहरणों को याद मैं जब यह निपटान के लिए पता नहीं है। WaitOne() के बाद इसे डिस्पोज़ करना - कॉल इसे कई बार निपटान करेगा और शायद इसे डिस्पोजेड किया जाएगा जबकि अन्य थ्रेड अभी भी प्रतीक्षा कर रहे हैं।
धागा है कि घटना बनाया यह करने के लिए किसी भी संदर्भ नहीं है। सेटर-थ्रेड को इसका निपटान नहीं करना चाहिए क्योंकि इस एमआरई के लिए अन्य धागे इंतजार कर रहे हैं। जैसा कि पहले उल्लेख किया गया है, प्रत्येक प्रतीक्षा धागा इसे निपटाने में सक्षम नहीं है।
तो सवाल यह है: जब इस ManualResetEvent निपटारा किया जाना चाहिए?
कोड गैरकानूनी है और एमआरई का केवल * एक * उदाहरण है। विधि के अंत में इसे निपटाना ठीक है। –
नहीं, मुझे ऐसा नहीं लगता है।कोड जो एमआरई बनाता है वह एक बटन क्लिक इवेंट हैंडलर है। आप इसे कई बार क्लिक करने में सक्षम हैं जो एकाधिक एमआरई बनाता है। उपरोक्त कोड सरलीकृत है। इस विधि के अंत में एमआरई का निपटारा काम नहीं करेगा क्योंकि विधि समाप्त होने के बाद 11 एमआरई का उपयोग कर रहे हैं। सेटर-थ्रेड 10 सेकंड तक प्रतीक्षा करता है और 10 अन्य धागे इस एमआरई के लिए इंतजार कर रहे हैं। –