How to pass parameters to the function called by ElapsedEventHandler?
How to pass parameters to the function called by ElapsedEventHandler?
My code:
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);
}
What I want to do开发者_StackOverflow is between the brackets ([ and ]). But just doing it like that obviously doesn't work...
You can't do this within the method itself - you have to make your event handler aware of its context, effectively. The simplest way of doing this is with a lambda expression or anonymous method:
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);
}
Here, the anonymous method (the bit with the delegate
keyword) has created a delegate which knows about the Index
parameter to InitTimer
. It just calls the KeepAliveElapsed
method. I've used the anonymous method syntax because you didn't need the sender or event args; if you did need them I'd probably use a lambda expression instead, e.g.
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);
}
(Note that conventionally the Index
parameter should be called index
, btw.)
精彩评论