2013-01-08 11 views
6

मैं एक स्थिर कोड विश्लेषण से कुछ चेतावनियों से छुटकारा पाने पर काम कर रहा हूं। एक विशिष्ट मामले में 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 निपटान की समस्या के लिए एक अच्छा समाधान हो सकता है?

+1

@Steven क्यों प्रतिनिधि को 'completEvent' की प्रति के साथ काम करना चाहिए? क्या आप इस बिंदु को समझा सकते हैं। –

उत्तर

6

आप रीशेर्पर की "त्वरित सुधार" और "संदर्भ कार्रवाई" को मिश्रित कर रहे हैं। जब ReSharper कुछ ठीक करने का प्रस्ताव करता है, तो सबसे अधिक संभावना है कि आप वहां एक बल्ब देखेंगे। आपको यहां बल्ब नहीं दिख रहा है, क्योंकि इस चेतावनी में कोई त्वरित समाधान नहीं है।

लेकिन त्वरित सुधारों के अलावा रीशर्पर में "संदर्भ क्रियाएं" भी हैं, जहां यह आपके लिए कुछ नियमित कार्य कर सकती है (उनके बारे में एक छोटे से प्रतिक्रियाओं की तरह सोचें)। जब रीशेपर के पास कर्सर के नीचे एक कोड के लिए एक संदर्भ कार्रवाई है, तो यह आपको एक पिक दिखाएगा। यहां आप एक संदर्भ कार्रवाई देखते हैं जिसे "चेक करें अगर कुछ शून्य नहीं है"। इसका कोई चेतावनी नहीं है, और कोई सम्मेलन नहीं है कि एक चर का निपटान करने के बाद शून्य पर सेट किया जाएगा।

इसके अलावा, जब आप Alt-Enter दबाते हैं, तो आपको यह इंप्रेशन देने के लिए एक स्ट्राइक आउट आउट बल्ब दिखाई देगा कि ReSharper इस चेतावनी के लिए कोई त्वरित समाधान नहीं सुझाता है, लेकिन यह टिप्पणियों के साथ इसे अक्षम कर सकता है।वास्तव में, यह चेतावनी आसानी से दूर जाने का यही एकमात्र तरीका है। लेकिन मैं इसके बजाय कोड के इस टुकड़े को फिर से लिखूंगा।

2

मैं कुछ ही घंटों पहले ही ठीक से भाग गया।

यह एक झूठा अलार्म है। आर # यह समझ में नहीं आता है कि ईवेंट सेट होने तक निष्पादन अवरुद्ध होगा, भले ही यह सही समय पर निपटान को रोकता है।

आईएमओ यह एक अच्छा समाधान है। बस आर # को नजरअंदाज करें।

एक ObjectDisposedException पकड़ने का सुझाव जब आप कॉल completedEvent.Set() मामले में टाइमआउट समाप्त हो गया है और घटना निपटारा किया गया है। मुझे नहीं लगता कि यह आर # चेतावनी को रोक देगा, लेकिन यह सुरक्षित है।

+1

"निष्पादन तब तक अवरुद्ध होगा जब तक कि ईवेंट सेट न हो" निष्पादन ब्लॉक नहीं होता है, यह टाइमआउट के बाद चलता है। –

+0

ओओएफ। हाँ। टाइमआउट याद किया। मुझे अपने कोड के समानता के साथ इतना लिया गया था कि मुझे वह याद आया। – spender

+0

@ हैमलेट का उल्लेख है, यह संभव है कि टाइमआउट के मामले में 'सेट() 'विधि को निपटाने के बाद बुलाया जाए। मैं कोड के बहुत समान टुकड़े में 'ऑब्जेक्ट डिस्प्ले अपवाद' को पकड़ रहा हूं। यह उस समय का सबसे सुरक्षित समाधान था जिसे मैं सोच सकता था, हालांकि मैं अपवादों के बिना समाधान पसंद करूंगा। – Thorarin

1

मुझे लगता है कि आपको शून्य पर जांच करनी होगी, इसके अलावा आपको यह अपवाद भी पकड़ना होगा। कल्पना करें कि क्या होगा यदि someFunctimeoutMilliseconds से अधिक चलाता है।

संबंधित मुद्दे