2011-04-12 62 views
0

基本上我试图在C#和Android平台之间编写一个通用的进程间通信实现(使用Java)。从类中提升C#中的事件

创建套接字堆栈很简单,但我想知道的是将代理传入我的TcpServer类并引发所需事件的好模式。

到目前为止的想法是。

while (connected) { 
    //Compile all the required data and so forth 
     switch (currentState) 
     { 
       case CurrentServerState.EventReceived: 
        //Raise my event... 
       break; 
       case CurrentServerState.ObjectReceived: 
       break; 

     } 
} 

所以将正确的实现仅仅暴露代表和使用反射阵列,以匹配沿着这些线路的事件名称或东西吗?我有什么选择?另外,如何确保在UI线程中引发了任何引发的事件,因为这全部来自为服务器创建的线程?

回答

1

如果您不需要将任何自定义参数传递给事件处理函数,则可以使用使用基本EventArgs的默认EventHandler委托。

声明你要提供这样的事件:

public event EventHandler EventReceived; 
public event EventHandler ObjectReceived; 

声明每个事件来处理引发事件对你的保护方法。这实际上只是一种方便,无需每次都需要重复此操作。你可以这样做内联。

如果没有附加的事件处理程序,则您的事件将为空。该方法在触发事件之前处理检查。

protected void RaiseEventReceived(EventArgs e) 
{ 
    if (EventReceived != null) 
     EventReceived(this, e); 
} 

然后当您想要提升事件时调用该方法。该方法将处理检查以查看是否有人正在收听该事件。

public void SomeOtherMethod() 
{ 
    while (IsConnected) 
    { 
     switch (CurrentState) 
     { 
      case CurrentServerState.EventReceived: 
       RaiseEventReceived(EventArgs.Empty); 
       break; 

      case CurrentServerState.ObjectReceived: 
       RaiseObjectReceived(EventArgs.Empty); 
       break; 
     } 
    } 
} 

您可以声明自己的类,以通过派生自EventArgs(如下所示)将自定义参数传递给事件处理程序。按照惯例,你的类应该被命名为* something * EventArgs。

public class EventReceivedEventArgs : EventArgs 
{ 
    // Declare properties to hold additional event info here 
} 

那么你就需要声明一个自定义的委托,它需要新的事件参数的参数:

public delegate void EventReceivedEventHandler(object sender, EventReceivedEventArgs e); 

更新您的事件声明,而不是使用新的委托EventHandler类型:

public event EventReceivedEventHandler EventReceived; 

最后,在引发事件时,您当然会想要创建自定义事件参数类的新实例并初始化您的自定义属性。

客户端可以使用正常语法将多个处理程序附加到您的事件,并且它们将始终在正确的线程上调用。