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);
}
私がやりたいのは角かっこ([と])の間です。しかし、そのようにそれを行うだけでは明らかに機能しません...
メソッド自体の中でこれを行うことはできません。イベントハンドラーにそのコンテキストを効果的に認識させる必要があります。これを行う最も簡単な方法は、ラムダ式または匿名メソッドを使用することです。
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
と呼ばれる必要があることに注意してください。)