No se puede hacer esto dentro del método en sí mismo: tiene que hacer que su controlador de eventos sea consciente de su contexto, efectivamente. La forma más sencilla de hacerlo es con una expresión lambda o método anónimo:
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);
}
Aquí, el método anónimo (el bit con la palabra clave delegate
) ha creado un delegado que no conoce acerca del parámetro Index
-InitTimer
. Simplemente llama al método KeepAliveElapsed
. Utilicé la sintaxis del método anónimo porque no necesitabas el remitente ni los argumentos del evento; si lo hizo los necesito, probablemente use una expresión lambda en su lugar, p.
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);
}
(Tenga en cuenta que convencionalmente el parámetro Index
debería llamarse index
, por cierto.)
(Es curioso que volver a viejas preguntas y ver cuánto has aprendido en los últimos 3 años y cómo se han evolucionado. Esta es una de las razones por las que amo este sitio.) – lesderid