如何将参数传递给ElapsedEventHandler调用的函数?
问题描述:
如何参数传递给由ElapsedEventHandler调用的函数?如何将参数传递给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);
}
我想要做的是括号([和])。 但只是这样做,显然不工作...
答
你不能在方法本身内做到这一点 - 你必须使你的事件处理程序有效地意识到它的上下文。这样做的简单的方法是用一个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
关键字的比特)已经创建了所知道的Index
参数InitTimer
委托。它只是调用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
,顺便说一句。)
(这很有趣,回来的老问题,看看你有多少在过去3年中的经验和如何这是我喜欢这个网站的原因之一。) – lesderid 2013-05-15 15:53:20