2010-06-22 4 views
18

Comment passer des paramètres à la fonction appelée par ElapsedEventHandler?Comment passer des paramètres à la fonction appelée par ElapsedEventHandler?

Mon code:

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

Ce que je veux faire est entre les crochets ([et]). Mais le faire comme ça ne marche évidemment pas ...

+1

(Il est amusant de revenir à de vieilles questions et de voir combien vous avez appris au cours des 3 dernières années et comment vous J'ai évolué, c'est une des raisons pour lesquelles j'aime ce site.) – lesderid

Répondre

39

Vous ne pouvez pas le faire dans la méthode elle-même - vous devez rendre votre gestionnaire d'événements conscient de son contexte, efficacement. La façon la plus simple de le faire est avec une expression lambda ou méthode anonyme:

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

Ici, la méthode anonyme a créé un délégué qui connaît sur le paramètre Index-InitTimer (le bit avec le mot-clé delegate). Il appelle simplement la méthode KeepAliveElapsed. J'ai utilisé la syntaxe de la méthode anonyme car vous n'avez pas besoin de l'expéditeur ou des arguments de l'événement; Si vous avez besoin besoin d'eux, j'utiliserais probablement une expression lambda à la place, par exemple.

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

(Notez que conventionnellement le paramètre Index doit être appelé index, btw.)

+0

J'ai du mal à comprendre cela. L'événement Elapsed n'attend-il pas un délégué ElapsedEventHandler? – SWeko

+0

Merci, accepté! Mais pourquoi devrait-on l'appeler index? – lesderid

+0

@lesderid: Les noms de paramètres sont classiquement dans camelCase plutôt que dans PascalCase. –

Questions connexes