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