SORU
24 NİSAN 2009, Cuma


C# Olaylar ve iş Parçacığı Güvenliği

Ben/sık şu tavsiyede okumak duymak:

Her zaman null teslim etmeden önce bir olay bir kopyasını alın ve ateş edin. Bu olay nerede ve olay yangın: null konumunu kontrol Yeri arasında sağ null olur parçacığı ile olası bir sorunu ortadan kaldıracak

// Copy the event delegate before checking/calling
EventHandler copy = TheEvent;

if (copy != null)
    copy(this, EventArgs.Empty); // Call any handlers on the copied list

GüncellendiBu da olay geçici üye olmak gerekebilir, ama Jon CLR kopya optimize uzakta değil onun cevabı Devletleri Skeet en iyi duruma getirme hakkında okuyarak düşündüm.

Ama bu sorun bile meydana gelmesi için, başka bir iş parçacığı böyle bir şey yapmış olması gerekir: bu arada

// Better delist from event - don't want our handler called from now on:
otherObject.TheEvent -= OnTheEvent;
// Good, now we can be certain that OnTheEvent will not run...

Gerçek sıra bu karışım olabilir:

// Copy the event delegate before checking/calling
EventHandler copy = TheEvent;

// Better delist from event - don't want our handler called from now on:
otherObject.TheEvent -= OnTheEvent;    
// Good, now we can be certain that OnTheEvent will not run...

if (copy != null)
    copy(this, EventArgs.Empty); // Call any handlers on the copied list

Bu noktada yazarın aboneliği sonra OnTheEvent çalışan ve onlar özellikle bunun olmasını önlemek için aboneliğiniz iptal edildi. Gerçekten, tabi kesinlikle add remove erişenleri uygun senkronizasyon ile özel bir olay uygulamasıdır. Ve ayrıca eğer bir kilit bir olay ateş ederken yapılacak Olası kilitlenme sorunu var.

Yani bu 16**? Öyle görünüyor ki bu şekilde bir sürü insan olmalı alarak bu adımı korumak için kendi kodundan birden çok iş parçacığı, zaman içinde gerçeklik bana öyle geliyor ki, olaylar çok daha fazla dikkat gerektirir bu daha önce onlar kullanılabilir bir parçası olarak bir çok iş parçacıklı tasarım. Sonuç olarak, insanlar kim almayan ek umurumda da görmezden gel bu tavsiye - bu sadece değil bir sorun için tek iş parçacıklı programlar, ve aslında, belirli olmaması volatile en online kod örneği, tavsiye edilebilir olması, hiçbir etkisi yoktur.

(Ve bunu çok daha önceleri null kontrol için sadece delegate { } üye boş Bildirgesi atamak için daha basit değil mi?)

Güncelleme:Belli değildi, tavsiye niyeti - her koşulda null başvuru özel durumu önlemek için kavramak yaptım. Benim demek istediğim bu, belirli bir null başvuru özel durumu Tek oluşursa başka bir iş parçacığı delisting gelen olay ve tek bir neden için yapıyor bunu sağlamak için başka görüşmeleri olacaktır aldı) bu olay, açıkça DEĞİL elde ederek bu tekniği. Bir yarış durumu daha iyi olurdu açığa gizlemek olurdun! Boş istisna bileşenin bir istismar tespit etmek için yardımcı olur. Eğer istediğiniz bileşeni korunmayı kötüye, anlayabildin örnek WPF - deposu iş parçacığı KİMLİĞİ içinde yapıcı ve daha sonra bir istisna atar eğer başka bir iş parçacığı çalışır etkileşim doğrudan bileşeni. Ya da başka bir iş parçacığı için güvenli gerçekten bir bileşeni uygulamak (kolay bir iş değil).

Sadece bu kopya deyim/check yapıyor kargo kült programlama, kodunuzu karmaşa ve gürültü eklemeyi düşünüyorum. Aslında başka bir iş parçacığı karşı korumak için gerektirir çok daha fazla iş.

Eric Lippert blog gönderilerini yanıt güncelleme:

Yani orada önemli bir şey kaçırmış ilgili olay işleyicileri: "olay işleyicileri edilir sağlam karşısında olmak denir sonra bile olay olmuştur aboneliği", ve belli ki bu nedenle biz sadece ihtiyacımız bakımı hakkında da bir olasılık olay temsilci olmak null.Olay işleyicileri üzerinde bu şartı her yerde belgelenmiştir?

Ve böylece: "hiç kaldırıldığını başka yolları da bu sorunu çözmek için; örneğin, işleyicisi boş bir eylem başlatılıyor. Ama boş bir kontrol yapmak standart kalıptır."

Sorumun kalan tek parçası yanineden açık-boş-onay "standart modeli"?Alternatif, boş temsilci atama, sadece = delegate {} olay bildirimi eklenecek gerektirir ve bu olay ortaya çıkar, her yerden pis töreni bu tepecikleri ortadan kaldırır. Boş temsilci ucuz oluşturmaya olduğundan emin olmak için kolay olurdu. Ya da hala bir şey eksik muyum?

Kesinlikle Jon Skeet önerdiği gibi (bu sadece bu olmalı .NET 1.2005 yılında yapmış olması gerektiği gibi öldü başlamadı x tavsiyesi?

CEVAP
29 NİSAN 2009, ÇARŞAMBA


Bu soru bir iç tartışma bir süre önce geldi; bir süredir bu blog için şimdi niyetinde olmadım.

Konu ile ilgili yazı burada:

Events and Races

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GFX Tutorials

    GFX Tutorial

    12 AĞUSTOS 2013
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010
  • NLthomas21

    NLthomas21

    20 Mayıs 2008