如何向ElapsedEventHandler调用的函数传递参数?
我的代码:
private static void InitTimer(int Index)
{
keepAlive[Index] = new Timer();
keepAlive[Index].Interval = 3000;
keepAlive[Index].Elapsed += new ElapsedEventHandler(keepAlive_Elapsed[, Index]);
keepAlive[Index].Start();
}
public static void keepAlive_Elapsed(object sender, EventArgs e[, int Index])
{
PacketWriter writer = new PacketWriter();
writer.AppendString("KEEPALIVE|.\\");
ServerSocket.Send(writer.getWorkspace(), Index);
ServerSocket.DisconnectSocket(Index);
}
我想做的是在括号(和)之间。但这样做显然行不通...
发布于 2010-06-22 23:06:23
你不能在方法本身中做到这一点--你必须让你的事件处理程序有效地知道它的上下文。最简单的方法是使用lambda表达式或匿名方法:
private static void InitTimer(int Index)
{
keepAlive[Index] = new Timer();
keepAlive[Index].Interval = 3000;
keepAlive[Index].Elapsed += delegate { KeepAliveElapsed(Index); };
keepAlive[Index].Start();
}
public static void KeepAliveElapsed(int Index)
{
PacketWriter writer = new PacketWriter();
writer.AppendString("KEEPALIVE|.\\");
ServerSocket.Send(writer.getWorkspace(), Index);
ServerSocket.DisconnectSocket(Index);
}
在这里,匿名方法(带有delegate
关键字的位)创建了一个知道InitTimer
的Index
参数的委托。它只调用KeepAliveElapsed
方法。我使用匿名方法语法是因为您不需要发送者或事件参数;如果您确实需要它们,我可能会使用lambda表达式,例如
private static void InitTimer(int Index)
{
keepAlive[Index] = new Timer();
keepAlive[Index].Interval = 3000;
keepAlive[Index].Elapsed += (sender, args) => KeepAliveElapsed(sender, Index);
keepAlive[Index].Start();
}
public static void KeepAliveElapsed(object sender, int Index)
{
PacketWriter writer = new PacketWriter();
writer.AppendString("KEEPALIVE|.\\" + sender);
ServerSocket.Send(writer.getWorkspace(), Index);
ServerSocket.DisconnectSocket(Index);
}
(请注意,按照惯例,Index
参数应该称为index
,btw。)
https://stackoverflow.com/questions/3094422
复制相似问题