从课堂上用C#引发事件
基本上,我试图在C#和Android平台(使用Java)之间编写一个通用的进程间通信实现 创建套接字堆栈非常简单,但我想知道的是,将委托传递到TcpServer类并引发所需事件的好模式是什么 到目前为止,这个想法是正确的从课堂上用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
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;
最后,在引发事件时,您当然希望创建自定义事件参数类的新实例并初始化自定义属性
客户端可以使用正常语法将多个处理程序附加到事件,并且始终在正确的线程上调用它们