I am trying to learn some WCF principles by following an example of a WCF application (from Sacha Barber). Now I would like to convert the following function into 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); } } } but I have some problems,because the following code is not accepted by the compiler 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,New AsyncCallback(AddressOf EndAsync),Nothing) Next End If End Sub it says
Coming to the point,is it then possible in VB.NET get the handlers linked to a certain event in some other way? |
|||
|
use ChatEventEvent (or *EventName*Event) It won't show up in intellisense,but the members of it will. VB.NET creates a variable behind the scenes,to hide the complexity from the coder... This is only available in the class that declares the event (or perhaps its descendants) |
|||||||||||||||||
|
You're likely trying to write this code in a class that is a descendant of the class that declares the What Happens Consider this declaration: Public Event MyEvent as EventHandler Simple enough,right? What this actually does,however,is this (you just don't see it) 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 And when you invoke the event: RaiseEvent MyEvent(Me,EventArgs.Emtpy) It actually calls the code in the Edit If events in VB.NET can't be treated as variables anywhere (they can be treated as variables in the declaring class in C#,which is why your C# example compiles),then you'll have to explicitly implement the event yourself. See the MSDN page on the Event statement for more information on how to do that. To make a long story short,you're going to want some way to store multiple event handlers (or use a single event handler along with You could use something like this: 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,Nothing) Next EndRaiseEvent End Event So now,if you call RaiseEvent MyEvent(Me,EventArgs.Emtpy) It will raise the event in the fashion you're expecting. |
||||||||||||||||
|
in the above first example,compilerGeneratedName is always the event name followed by the word "Event",so,ChatEventEvent,in this case. –
Rick Mogstad
Jan 29 '10 at 22:49
|
|
thanks for the info,they could be helpful,and for the effort @Rick Yeah! That made the trick for me –
Drake
Feb 1 '10 at 9:29
|