2010-06-22 386 views
18

如何參數傳遞給由ElapsedEventHandler調用的函數?如何將參數傳遞給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); 
} 

我想要做的是括號([和])。 但只是這樣做,顯然不工作...

+1

(這很有趣,回來的老問題,看看你有多少在過去3年中的經驗和如何這是我喜歡這個網站的原因之一。) – lesderid 2013-05-15 15:53:20

回答

39

你不能在方法本身內做到這一點 - 你必須使你的事件處理程序有效地意識到它的上下文。這樣做的簡單的方法是用一個lambda表達式或匿名方法:

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

這裏,匿名方法(與delegate關鍵字的比特)已經創建了所知道的Index參數InitTimer委託。它只是調用KeepAliveElapsed方法。我使用了匿名方法語法,因爲您不需要發件人或事件參數;如果你沒有需要他們,我可能會使用一個lambda表達式來代替,如

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,順便說一句。)

+0

我很難理解這一點。 Elapsed事件不期望ElapsedEventHandler委託? – SWeko 2010-06-22 15:23:00

+0

謝謝,接受!但爲什麼它應該被稱爲索引? – lesderid 2010-06-22 15:25:23

+0

@lesderid:參數名稱通常在camelCase中,而不是在PascalCase中。 – 2010-06-22 15:26:31