2009-07-18 11 views
20

System.Threading.ConcurrentQueue.TryDequeue विधि ने दूसरे दिन एक अपवाद फेंक दिया जो मुझे आश्चर्य से पूरी तरह से ले गया। यहाँ स्टैक ट्रेस है:सिस्टम में बग। रैंडम कन्स्ट्रक्टर?

System.OverflowException: Negating the minimum value of a twos complement number is invalid. 
    at System.Math.AbsHelper(Int32 value) 
    at System.Random..ctor(Int32 Seed) 
    at System.Threading.Collections.ConcurrentQueue`1.TryDequeueCore(T& result) 
    at System.Threading.Collections.ConcurrentQueue`1.TryDequeue(T& result) 
    at MyProgram.ThreadProc() in c:\MyProgram\Main.cs:line 118 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

पहले तो मैंने सोचा था कि समस्या यह है कि TryDequeueCore एक बुरा मान के साथ Random निर्माता कहा जाता था। लेकिन आगे की जांच से पता चलता है कि TryDequeueCore डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करता है। यह मेरे लिए लग रहा है त्रुटि की तरह Random निर्माता में है:

.method public hidebysig specialname rtspecialname 
     instance void .ctor() cil managed 
{ 
    // Code size  12 (0xc) 
    .maxstack 8 
    IL_0000: ldarg.0 
    IL_0001: call  int32 System.Environment::get_TickCount() 
    IL_0006: call  instance void System.Random::.ctor(int32) 
    IL_000b: ret 
} // end of method Random::.ctor 

System.Environment.TickCount संपत्ति के लिए दस्तावेज़ के रूप में कहते हैं:

इस संपत्ति के मूल्य प्रणाली टाइमर से ली गई है और संग्रहीत किया जाता है एक 32-बिट हस्ताक्षरित पूर्णांक के रूप में। नतीजतन, यदि सिस्टम लगातार चलता है, टिककंट शून्य से Int32 .. :: अधिकतम 24.9 दिनों के लिए अधिकतम वैल्यू, फिर Int32 पर जाएं .. :: MinValue, जो ऋणात्मक संख्या है, फिर वृद्धि अगले 24.9 दिनों के दौरान वापस शून्य पर।

तो, अगर आपको लगता है कि एक मिलीसेकंड अवधि के दौरान Random निर्माता फोन (के बाद सिस्टम int.MaxValue मिलीसेकेंड के लिए साइन किया गया है), यह इस अपवाद फेंकने के लिए जा रहा है।

क्या किसी के पास कोई कामकाज है? अपने कोड के लिए, मैं CreateRandom विधि बना सकता हूं जो TickCount मान प्राप्त करता है और इसे int.MinValue के लिए जांचता है। लेकिन कोड के बारे में क्या करना है जिसका मेरा कोई नियंत्रण नहीं है?

मुझे उम्मीद है कि आरटीएल टीम इसे .NET 4.0 में ठीक करेगी।

अद्यतन 2009/07/22: बीसीएल टीम ने बग का जवाब दिया और कहा कि इसे अगली रिलीज के लिए हल किया गया है।

+2

मुझे आशा है कि आपने एक बग रिपोर्ट बनाई है :) – n3rd

+2

वाह, अच्छी जांच। माइक्रोसॉफ्ट कनेक्ट पर – GManNickG

+1

बग की सूचना दी गई। https://connect.microsoft.com/VisualStudio बग # 475447। –

उत्तर

4

try/catch और बाद में एक मिलीसेकंड पुनः प्रयास करें, केवल एकमात्र चीज है जो आप तब तक कर सकते हैं जब तक कि यह बग ठीक न हो जाए।

+0

शायद। लेकिन ConcurrentQueue.TryDequeue का मामला लें। उस विधि को अपवाद फेंकना नहीं है। अब मुझे कोशिश/पकड़ ब्लॉक में TryDequeue पर सभी कॉल लपेटनी है। और कोड के बारे में जो मुझे नहीं पता है यादृच्छिक उपयोग करता है? –

+0

जब तक सिस्टम लाइब्रेरीज़ में गहराई से कोई बग होता है जो किसी को कभी नहीं होने पर अपवादों को फेंकने का कारण बनता है, तो आप अपने नियंत्रण के बाहर अन्य कोड के साथ और क्या कर सकते हैं, जिसके लिए आपके पास कोई स्रोत नहीं है, और कौन सा कॉल कॉल कर सकता है सवाल में सिस्टम lib? जब तक आप एक ओपन-सोर्स स्टैक पर स्विच नहीं कर सकते, जहां आप उन्हें ढूंढने के बाद त्रुटियों को ठीक कर सकते हैं, तो आप अनिवार्य रूप से मालिकाना कोड आपूर्तिकर्ता की दया पर हैं। कोशिश/पकड़ केवल एक चीज है जो आप कर सकते हैं, और यह निश्चित रूप से सही नहीं है, लेकिन, और क्या? –

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