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