मैं एक स्थिर कोड विश्लेषण से कुछ चेतावनियों से छुटकारा पाने पर काम कर रहा हूं। एक विशिष्ट मामले में ManualResetEvent
पर कोई डिस्पोजेक्शन नहीं किया जा रहा था।क्या यह रिशेर्पर डिस्पोजेड क्लोजर चेतावनी के लिए ठीक है क्या कोई समझ है?
प्रश्न में कोड मुख्य थ्रेड पर Func
निष्पादित करता है और एक निश्चित संख्या में मिलीसेकंड के लिए कॉलिंग थ्रेड को अवरुद्ध करता है। मुझे एहसास है कि यह एक अजीब चीज की तरह लगता है, लेकिन यह इस सवाल के दायरे से बाहर है, इसलिए मेरे साथ भालू।
मैं बहुत की तरह एक using
कथन जोड़ मान लीजिए:
object result = null;
using (var completedEvent = new ManualResetEvent(false))
{
_dispatcher.BeginInvoke((Action)(() =>
{
result = someFunc;
completedEvent.Set(); // Here be dragons!
}));
completedEvent.WaitOne(timeoutMilliseconds);
return result;
}
अब, मुझे लगता है कि इस समस्या का कारण हो सकती है। मैं Resharper का उपयोग भी करता हूं और यह मुझे "डिस्पोजेड क्लोजर तक पहुंच" संदेश के साथ चेतावनी देता है।
Resharper उल्लंघन-लाइन बदलकर इसे ठीक करने का प्रस्ताव:
if (completedEvent != null)
{
completedEvent.Set();
}
अब, प्रस्तावित समाधान पहेली मुझे। सामान्य परिस्थितियों में, कोई कारण नहीं होगा कि एक चर कथन द्वारा null
पर सेट किया जाएगा। क्या .NET में बंद करने के लिए कुछ कार्यान्वयन विवरण है जो चर को बंद करने वाले चर के बाद null
होने के लिए वैरिएबल की गारंटी देगा?
एक बोनस सवाल के रूप में, क्या ManualResetEvent
निपटान की समस्या के लिए एक अच्छा समाधान हो सकता है?
@Steven क्यों प्रतिनिधि को 'completEvent' की प्रति के साथ काम करना चाहिए? क्या आप इस बिंदु को समझा सकते हैं। –