如何将参数传递给ElapsedEventHandler调用的函数?

问题描述:

如何参数传递给由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

你不能在方法本身内做到这一点 - 你必须使你的事件处理程序有效地意识到它的上下文。这样做的简单的方法是用一个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