簡體   English   中英

從類中引發C#事件

[英]Raising events in C# from classes

基本上,我試圖在C#和Android平台(使用Java)之間編寫通用的進程間通信實現。

創建套接字堆棧非常簡單,但是我想知道的是將委托傳遞到我的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線程中引發了任何引發的事件?

如果不需要將任何自定義參數傳遞給事件處理程序,則可以使用使用基本EventArgs的默認EventHandler委托。

聲明您要提供的事件,如下所示:

public event EventHandler EventReceived;
public event EventHandler ObjectReceived;

為每個事件聲明一個受保護的方法來為您處理引發事件。 實際上,這只是避免每次需要重復此操作時的一種方便。 您可以內聯進行。

如果沒有附加的事件處理程序,您的事件將為null。 該方法在觸發事件之前進行檢查。

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
}

然后,您需要聲明一個采用新事件args參數的自定義委托:

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

更新事件聲明以使用新的委托類型而不是EventHandler:

public event EventReceivedEventHandler EventReceived;

最后,當引發事件時,您當然希望創建自定義事件參數類的新實例並初始化您的自定義屬性。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM