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

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

18
задан lesderid 22 June 2010 в 15:04
поделиться

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 , кстати.)

43
ответ дан 30 November 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: