Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从课堂上用C#引发事件_C#_Android_Multithreading_Sockets_Tcp - Fatal编程技术网

从课堂上用C#引发事件

从课堂上用C#引发事件,c#,android,multithreading,sockets,tcp,C#,Android,Multithreading,Sockets,Tcp,基本上,我试图在C#和Android平台(使用Java)之间编写一个通用的进程间通信实现 创建套接字堆栈非常简单,但我想知道的是,将委托传递到TcpServer类并引发所需事件的好模式是什么 到目前为止,这个想法是正确的 while (connected) { //Compile all the required data and so forth switch (currentState) { case CurrentSer

基本上,我试图在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 class EventReceivedEventArgs : EventArgs
{
    // Declare properties to hold additional event info here
}
声明要使其可用的事件,如下所示:

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;
        }
    }
}
然后在要引发事件时调用该方法。该方法将处理检查以查看是否有人在侦听事件

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;
        }
    }
}
您可以声明自己的类,通过从以下EventArg派生来将自定义参数传递给事件处理程序。按照惯例,类应命名为*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;
最后,在引发事件时,您当然希望创建自定义事件参数类的新实例并初始化自定义属性

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