Ответ 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
) создал делегат, который знает о параметре 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
, btw.)