繁体   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