2010-11-03 29 views

cevap

15

Buna nasıl yanıt vereceğimi ve çok sayıda MSDN örneğine baktığımda, Set dönüş değeri göz ardı edilmediğinden emin olun, bu nedenle önemli veya gerçekleşmesi olası olmamalıdır.

Ancak bu yeterince iyi değildi. VM'mi kovdum ve kodlara bakmak için Reflector'u açtım. ManualResetEvent küme yok, ancak EventWaitHandle öğesinden devralınır. İşte kod:

[DllImport("kernel32.dll", SetLastError=true)] 
internal static extern bool SetEvent(SafeWaitHandle handle); 

WinIOError() çağrısı sadece biz gerçekten umurumda değil GetLastWin32Error çağırır: SetEvent Kernel32 ithal edilmektedir

public bool Set() 
{ 
    bool flag = Win32Native.SetEvent(base.safeWaitHandle); 
    if (!flag) 
    { 
     __Error.WinIOError(); 
    } 
    return flag; 
} 

. Temelde bu yanlış çağrı dönmek anlamına gelir, oldukça yanlış bir şey, Win32 yerel kodunda gerçekleşmiş olmalıydı.

Resmi MSDN belgelerinde barındırılan kodun dönüş değerini göz ardı ettiği gerçeği ile birlikte bu bilgiyi koymak (neden olmasın, çekirdek ne zaman hata yaparsa, ne yapacaksınız?) Temizlemek isterseniz, kendinizi güvenli bir şekilde göz ardı edebilirsiniz mantığın biraz olsun ya da al ve özellikle pedantic iseniz giriş yap.

+2

İyi araştırılmış cevap. +1 – spender

+0

Teşekkürler! İlginç bir soru oldu ve beni meraklandırdı. –

+1

Teşekkürler Erik. Çalışmalarından ilham alarak aynı şeyi yaptım ve Reflektör'ü açtım. WinIOError(), her zaman mantıklı olan Win32 hata kodu Win32'yi temsil etmeye çalışan bir istisna atar gibi görünüyor - ama yine de gerçekten neden arama dönüş değeri olduğunu açıklamıyor! – SoftMemes

0

Sadece günlük hatası olduğundan emin değilim ve devam etmeye devam edeceğim. Set() 'un yanlış sonucu, bekleme işleyicileri tarafından yönetilen iş parçacığı senkronizasyonunda yanlış davranışlar getirebilir. Bu multithreading ... Yanlış Set() sonucu işleme vizyon - büyük olasılıkla çoğu durumda işlenmemiş olabilir istisna.

İlgili konular