Как передать параметры в функцию, вызванную ElapsedEventHandler? - PullRequest
18 голосов
/ 22 июня 2010

Как передать параметры в функцию, вызываемую 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 Ответ

43 голосов
/ 22 июня 2010

Вы не можете сделать это в самом методе - вы должны эффективно информировать обработчик событий о его контексте.Самый простой способ сделать это с помощью лямбда-выражения или анонимного метода:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...