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

21

如何向被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
回到以前的问题,看看自己在过去三年中学了多少,以及如何成长,这真是很有趣。这也是我喜欢这个网站的原因之一。 - lesderid
1个回答

51

你不能在方法本身内部完成这个操作,必须让事件处理程序意识到它的上下文。最简单的方法是使用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关键字的部分)创建了一个知道InitTimerIndex参数的委托。它只是调用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。)


我很难理解这个。难道Elapsed事件不需要一个ElapsedEventHandler委托吗? - SWeko
1
@lesderid:参数名称通常使用camelCase而不是PascalCase约定。 - Jon Skeet
@SWeko:是的,我们正在创建一个ElapsedEventHandler,可以使用匿名方法或lambda表达式。该委托恰好调用KeepAliveElapsed,但它不必具有完全相同的签名。 - Jon Skeet
@SWeko:是的,尽管在使用lambda表达式时加上“new EventHandler”部分会显得相当奇怪。 - Jon Skeet
1
@amaranth:如果你感到抱歉,那么你应该知道在另一个问题下添加评论试图引起注意是不合适的。我不会通过回答你的问题来奖励这种行为。请以后不要这样做。 - Jon Skeet
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接