2009-07-18 21 views
20

System.Threading.ConcurrentQueue.TryDequeue yöntemi, geçen gün beni tamamen şaşırtmış bir istisna attı. İşte yığın izleme: İlk baştaHata mı?

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() 

Sorun TryDequeueCore kötü değerle Random yapıcı denilen olduğunu düşünüyorum. Ancak daha fazla araştırma, TryDequeueCore'un varsayılan kurucuyu çağırdığını ortaya koymaktadır.

.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 mülkiyet belgelerine olarak diyor: error Random yapıcı olduğu gibi bana bakıyor

bu özelliğin değeri sistem zamanlayıcı gelen türetilmiştir ve saklanır

olarak 32 bit işaretli bir tam sayı. Sistem sürekli çalışır Sonuç olarak, eğer , TickCount .. :: Int32 sıfırdan artar. MaxValue yaklaşık 24.9 gün, daha sonra bir negatif bir sayı olan Int32 .. ::. MinValue, atlamak, daha sonra artırmak Bir sonraki 24.9 gün içinde sıfır. (Sistem int.MaxValue milisaniye kadar olmuştur sonra) o tek milisaniye süre içinde Random yapıcısı ararsanız

Yani, istisna olacak.

Herkesin bir çözümü var mı? Kendi kodum için, TickCount değerini alan ve int.MinValue için denetleyen CreateRandom yöntemini yapabilirim. Ama üzerinde kontrolüm olmayan kodlar hakkında ne yapmalıyım?

Umarım RTL takımı bunu .NET 4.0'da düzeltir.

Güncelleştirme 2009/07/22: BCL Ekibi bu hataya yanıt verdi ve bir sonraki sürüm için çözümlendiğini söyledi.

+2

Umarım bir rapor hazırlamışsınızdır :) – n3rd

+2

Vay, güzel bir araştırma. Microsoft Connect'te – GManNickG

+1

Hata bildirildi. https://connect.microsoft.com/VisualStudio Hata # 475447. –

cevap

4

try/ ve bir milisaniye tekrar denemek, bu hata giderilinceye kadar yapabileceğiniz tek şey hakkında görünüyor.

+0

. Ancak ConcurrentQueue.TryDequeue örneğini alın. Bu yöntemin hiç istisna atmaması gerekiyordu. Şimdi bir try/catch bloğunda tüm çağrıları TryDequeue'a sarmak zorundayım. Ve bilmiyorum kod Rastgele kullanır? –

+0

Sistem kitaplıklarında derin bir düşüş olduğu sürece, hiç bir zaman olmaması gereken durumlarda istisnaların ortaya çıkmasına neden olan bir hata var, denetiminizin dışında başka bir kodla başka neler yapabiliyorsunuz, hangi kaynaklarınız yok ve hangi MIGHT çağrısı diyorsunuz? sistem lib söz konusu? Açık kaynak bir yığına geçiş yapamazsanız, bunları bulduğunuzda hataları düzeltebilmeniz durumunda, kaçınılmaz olarak tescilli kod tedarikçisinin merhametine sahip olursunuz. Deneyin/yakalamanız sadece yapabileceğiniz tek şey ve kesinlikle mükemmel değil, ama başka ne var? –