2010-06-22 16 views
18

Jak przekazać parametry do funkcji wywoływanej przez ElapsedEventHandler?Jak przekazać parametry do funkcji wywoływanej przez ElapsedEventHandler?

Mój kod:

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

Co chcę zrobić jest w nawiasach ([i]). Ale robienie tego w ten sposób oczywiście nie działa ...

+1

(To zabawne, aby wrócić do starych pytań i zobaczyć, jak wiele się nauczyłem w ciągu ostatnich 3 lat, a jak cię To jeden z powodów, dla których kocham tę stronę.) – lesderid

Odpowiedz

39

Nie można tego zrobić w samej metodzie - trzeba sprawić, aby program obsługi zdarzeń był świadomy swojego kontekstu. Najprostszym sposobem na to jest za pomocą wyrażenia lambda lub metody anonimowej:

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

Tutaj metoda anonimowy (bit ze słowem kluczowym delegate) utworzył delegata, który wie o parametrze InitTimerIndex. To po prostu wywołuje metodę KeepAliveElapsed. Użyłem anonimowej składni metody, ponieważ nie potrzebujesz argumentów nadawcy lub zdarzenia; jeśli chcesz je , prawdopodobnie użyłbym wyrażenia lambda, np.

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

(Zauważ, że konwencjonalnie parametr Index powinien być nazywany index, btw.)

+0

Mam problem ze zrozumieniem tego. Czy zdarzenie Elapsed nie oczekuje delegata ElapsedEventHandler? – SWeko

+0

Dziękuję, zaakceptowano! Ale dlaczego miałby być nazywany indeksem? – lesderid

+0

@lesderid: Nazwy parametrów są tradycyjnie w camelCase, a nie w PascalCase. –

Powiązane problemy