2011-04-12 60 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; 

最後,在引發事件時,您當然會想要創建自定義事件參數類的新實例並初始化您的自定義屬性。

客戶端可以使用正常語法將多個處理程序附加到您的事件,並且它們將始終在正確的線程上調用。