2010-01-29 17 views
7

WCF uygulamasının bir örneğini (Sacha Barber'dan) izleyerek bazı WCF ilkelerini öğrenmeye çalışıyorum.GetInvocationLink'teki bir etkinliğin listesi

Private Sub BroadcastMessage(ByVal e As ChatEventArgs) 

    Dim handlers As EventHandler(Of ChatEventArgs) = ChatEvent 

    If handlers IsNot Nothing Then 

     For Each handler As EventHandler(Of ChatEventArgs) In handlers.GetInvocationList() 

      handler.BeginInvoke(Me, e, New AsyncCallback(AddressOf EndAsync), Nothing) 

     Next 

    End If 

End Sub 

o

diyor

Şimdi VB.NET

private void BroadcastMessage(ChatEventArgs e) 
{ 

    ChatEventHandler temp = ChatEvent; 

    if (temp != null) 
    { 
     foreach (ChatEventHandler handler in temp.GetInvocationList()) 
     { 
      handler.BeginInvoke(this, e, new AsyncCallback(EndAsync), null); 
     } 
    } 
} 

içine aşağıdaki işlevi dönüştürmek istiyoruz ancak aşağıdaki kod derleyici tarafından kabul edilmemesi nedeniyle ben bazı sorunlar var

Ortak Paylaşılan Olay ChatEvent (gönderen Nesne Olarak, e Olarak ChatEventArgs) 'dir olay ve noktaya geliyor doğrudan

denilen olamaz, o başka bir şekilde belli olaya bağlı işleyicileri olsun sonra VB.NET mümkündür?

cevap

7

kullanım ChatEventEvent (veya EventName Olay)

O intellisense görünmez, ancak bunun üyeleri olacak. Bu olay beyan sınıfta yalnızca

VB.NET coderdan karmaşıklığı gizlemek için, perde arkasında bir değişken oluşturur

... (ya da belki torunları)

+0

Sınıfınızda belgelenmemiş bir üye kullandığınızı ve (hatalı olduğum sürece) bu adlandırma politikasının gelecekteki derleyici sürümlerinde aynı kalmayı garanti etmediğini unutmayın. –

+0

@Adam - Evet, kesinlikle belgelemedim, gördüğüm kadarıyla, ama onların bir sebebi olmadıkça veya en azından bir alternatif sunmadıkça onları değiştiremediklerini göremiyorum. Her halükarda, örneğinizde olduğu gibi, tüm olayları kendi başınıza ele almadan, şu anda yapabileceğiniz tek yol budur. Sizin değişeceklerse sizinkiler hala çalışmaya devam edecek, ancak bu çalışmanın değişeceği ihtimali göz önüne alınır. –

5

Muhtemelen bu kodu, ChatEvent etkinliğini bildiren sınıfın soyundan gelen bir sınıfta yazmaya çalışmanız olasıdır. Olaylar, yalnızca bunları bildiren sınıfta değişkenler (bunları çağırmak dahil) olarak ele alınabileceğinden, bu yapılamaz. Bunun nedeni, event anahtar sözcüğünün aslında, bazı sahne arkası dönüşümlerini gerçekleştirmesi gereken derleyiciye işaret etmesidir.

bu beyanı düşünün Olur Ne: Yeterince basit

Public Event MyEvent as EventHandler 

, doğru mu? Bu aslında ne yapar, ancak bu

Private compilerGeneratedName as EventHandler 

Public Event MyEvent as EventHandler 
    AddHandler(ByVal value as EventHandler) 
     compilerGeneratedName += value 
    End AddHandler 
    RemoveHandler(ByVal value as EventHandler) 
     compilerGeneratedName -= value 
    End RemoveHandler 
    RaiseEvent(ByVal sender as Object, ByVal e as EventArgs) 
     compilerGeneratedName.Invoke(sender, e) 
    End RaiseEvent 
End Event 

(sadece görmüyorum) 'dir Ve olayını çağırmak zaman:

RaiseEvent MyEvent(Me, EventArgs.Emtpy) 

Aslında RaiseEvent blokta kodu çağırır.

Düzenleme

VB.NET olaylar değişkenler yerde (bunlar C# örneği derler neden C# beyan sınıf içinde değişkenler olarak tedavi edilebilir) olarak işlem yapamıyorsanız, o zaman etkinliği kendiniz açıkça uygulamak zorundasınız. Bunun nasıl yapılacağı hakkında daha fazla bilgi için MSDN page on the Event statement'a bakın. Uzun bir hikâye kısası yapmak için, birden fazla etkinlik işleyicisini depolamanın bir yolunu isteyeceksiniz (veya şimdi yapmaya çalıştığınız gibi, GetInvocationList ile birlikte tek bir olay işleyicisini kullanın). AddHandler ve RemoveHandler kod bloklarınızda, olay işleyicileri listesine (sırasıyla) ekleyip kaldırırsınız.

Böyle bir şey kullanabilirsiniz:

Private myEventList as New List(Of EventHandler) 

Public Custom Event MyEvent as EventHandler 
    AddHandler(ByVal value as EventHandler) 
     myEventList.Add(value) 
    End AddHandler 
    RemoveHandler(ByVal value as EventHandler) 
     myEventList.Remove(value) 
    End RemoveHandler 
    RaiseEvent(ByVal sender as Object, ByVal e as EventArgs) 
     For Each evt in myEventList 
      evt.BeginInvoke(sender, e, New AsyncCallback(AddressOf EndAsync), Nothing) 
     Next 
    EndRaiseEvent 
End Event 

Pekala sen

RaiseEvent MyEvent(Me, EventArgs.Emtpy) 

ararsanız Size bekliyorsanız moda olayı yükseltecektir.

+0

teşekkür ederiz Cevap için, ama sanırım benim durumum değil. Sınıfım ChatService olarak adlandırılır ve hem Paylaşılan Olay ChatEvent'i hem de ChatEvent'in InvocationList uygulamasını almaya çalıştığım Sub BroadcastMessage'ı bildirir. – Drake

+0

@marco: Yukarıdaki ilk örnekte, düzenlemelerim daha yararlı –

+1

olup olmadığına bakın, compilerGeneratedName * her zaman * olay adı ve ardından "Etkinlik" kelimesi, bu durumda, ChatEventEvent. –

İlgili konular