代码之家  ›  专栏  ›  技术社区  ›  lesderid

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

  •  18
  • lesderid  · 技术社区  · 16 年前

    如何将参数传递给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 回复  |  直到 16 年前
        1
  •  43
  •   Jon Skeet    16 年前

    您不能在方法本身内这样做-您必须使事件处理程序有效地了解其上下文。最简单的方法是使用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 方法。我使用了匿名方法语法,因为您不需要sender或event参数;如果您 如果需要,我可能会使用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 ,BTW)