2010-06-22 22 views
18

¿Cómo pasar parámetros a la función llamada por ElapsedEventHandler?¿Cómo pasar parámetros a la función llamada por ElapsedEventHandler?

Mi código:

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

Lo que quiero hacer es entre los corchetes ([y]). Pero simplemente hacerlo así obviamente no funciona ...

+1

(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

Respuesta

39

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.)

+0

Tengo problemas para entender esto. ¿El evento transcurrido no espera un delegado ElapsedEventHandler? – SWeko

+0

¡Gracias, aceptado! Pero, ¿por qué debería llamarse índice? – lesderid

+0

@lesderid: los nombres de los parámetros están convencionalmente en camelCase en lugar de PascalCase. –

Cuestiones relacionadas