Подтвердить что ты не робот

Как передать параметры функции, вызванной 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);
}

Я хочу сделать это между скобками ([и]). Но просто делать это явно не работает...

4b9b3361

Ответ 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.)