2011-01-19 14 views
7

Kütüphane sınıfımdan bir dizi etkinlik geliştirmek istiyorum, ancak bazı etkinlik abonelerinin kaba olacağını ve bazı olayları işlemek için uzun zaman alacağından endişeleniyorum. Ben her olayı yükseltmek için bir iş parçacığı havuzu iş parçacığı kullanarak yetiştirme parçacığı koruyabilecek düşündü: olaya tek abone varkenBeginInvoke'u MulticastDelegate ile kullanabilir miyim?

if (packet != null && DataPacketReceived != null) 
{ 
    var args = new DataPacketEventArgs(packet); 
    DataPacketReceived.BeginInvoke(this, args, null, null); 
} 

çalışıyor, ancak en kısa sürede ikinci abone geldiğinde, DataPacketReceived bir hale gelir Çok noktaya yayın temsilci ve hata iletisiyle birlikte bir bağımsız değişken istisnası alıyorum, "Temsilcinin yalnızca bir hedefi olmalı." Etkinliği ayrı bir iş parçacığında yükseltmenin kolay bir yolu var mı, yoksa bir iş parçacığı başlatmam ve sonra etkinliği oradan mı yükseltmem gerekiyor?

cevap

11

another site da benzer bir soru buldum ve tabiki Jon Skeet bunu yanıtladı.

if (packet != null && DataPacketReceived != null) 
{ 
    var args = new DataPacketEventArgs(packet); 
    var receivers = DataPacketReceived.GetInvocationList(); 
    foreach (EventHandler<DataPacketEventArgs> receiver in receivers) 
    { 
     receiver.BeginInvoke(this, args, null, null); 
    } 
} 
+2

Doğru ama her abone üzerinde 'BeginInvoke' çağıran mutlaka her ayrı iş parçacığı üzerinde çalışması anlamına gelmez unutmayın: my senaryosu için, ben ayrı bir iş parçacığı üzerinde her abone için olayı yükseltmeyi tercih ettik. Bu iplik havuzunun işi. – Ani

+1

Son birkaç gündür bu soruna birkaç kez bakıyorum, alıcıların '' nesnelerindeki 'EventHandler ' türünde bir nesne olmadığını açıkça belirtmek önemlidir. –