21

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

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

4

1 に答える 1

50

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

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

ここで、anonymousメソッド(キーワードを持つビット)は、へのパラメーターdelegateについて知っているデリゲートを作成しました。メソッドを呼び出すだけです。送信者またはイベント引数が必要なかったため、匿名メソッドの構文を使用しました。それらが必要な場合は、代わりにラムダ式を使用します。IndexInitTimerKeepAliveElapsed

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、btwと呼ばれる必要があることに注意してください。)

于 2010-06-22T15:06:23.107 に答える