web-dev-qa-db-ja.com

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);
}

私がやりたいのは角かっこ([と])の間です。しかし、そのようにそれを行うだけでは明らかに機能しません...

19
lesderid

メソッド自体の中でこれを行うことはできません。イベントハンドラーにそのコンテキストを効果的に認識させる必要があります。これを行う最も簡単な方法は、ラムダ式または匿名メソッドを使用することです。

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メソッドを呼び出すだけです。送信者またはイベント引数が必要なかったため、匿名メソッドの構文を使用しました。 did必要な場合は、代わりにラムダ式を使用します。

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
Jon Skeet