Как передать параметры функции, вызванной 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);
}
То, что я хочу сделать, между скобками ([и]). Но просто выполнение его как этот, очевидно, не работает...
Вы не можете сделать это в самом методе - вы должны эффективно информировать обработчик событий о своем контексте. Самый простой способ сделать это - использовать лямбда-выражение или анонимный метод:
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
. Я использовал синтаксис анонимного метода, потому что вам не нужны аргументы отправителя или события; если бы они вам понадобились , я бы, вероятно, использовал вместо них лямбда-выражение, например
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
, кстати.)