Önerildiği gibi sertifika uzatma yöntemi, yarış koşullarıyla ilgili sorunları gerçekten çözmez, aksine onları gizler.
public static void SafeInvoke(this EventHandler handler, object sender)
{
if (handler != null) handler(sender, EventArgs.Empty);
}
Belirtildiği gibi bu kod, geçici değişkenli çözüme mükemmel bir eşdeğerdir, ancak ...
Her ikisindeki sorun , etkinliğin abonesinin etkinlikten çıktıktan SONRA çağrılabilmesidir . Bu mümkündür, çünkü abonelik iptali temsilci örneği temp değişkenine kopyalandıktan sonra (veya yukarıdaki yöntemde parametre olarak iletildikten sonra), ancak temsilci çağrılmadan önce gerçekleşebilir.
Genel olarak, böyle bir durumda istemci kodunun davranışı tahmin edilemez: bileşen durumu, olay bildirimini halihazırda işlemeye izin veremezdi. Müşteri kodunu işleyebilecek şekilde yazmak mümkündür, ancak müşteriye gereksiz sorumluluk yükler.
İş parçacığı güvenliğini sağlamanın bilinen tek yolu, olayı gönderen için kilit ifadesini kullanmaktır. Bu, tüm aboneliklerin \ abonelikten çıkma \ çağrıların serileştirilmesini sağlar.
Daha doğru olmak için kilit, varsayılan 'this' olan add \ remove olay erişimci yöntemlerinde kullanılan aynı senkronizasyon nesnesine uygulanmalıdır.