向事件处理程序传递额外参数

本文关键字:参数 事件处理 程序 | 更新日期: 2023-09-27 18:04:24

我正试图将一些数据从一个事件处理程序传递到另一个,但我有点卡住了。在下面的代码中,我有两个事件:

  • 一个是"timer elapsed"事件
  • 第二个是"Ping Completed"事件,由"timer elapsed"事件引发。

在"Ping Completed"事件中,我需要从计时器经过的事件中访问一个变量。我该怎么做呢?

void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
   for (int i = 0; i < this.View.Rows.Count; i++)
   {
      this.IP = View.Rows[i].Cells[2].Value.ToString();
      PingOptions Options = new PingOptions(10, true);
      Ping thisPing = new Ping();
      thisPing.SendAsync(IPAddress.Parse(IP), 100, new byte[0], Options);
      thisPing.PingCompleted += new PingCompletedEventHandler(thisPing_PingCompleted);                    
    }
}
void thisPing_PingCompleted(object sender, PingCompletedEventArgs e)
{
    //i need to accsess the "int i" of the above loop Here
}

向事件处理程序传递额外参数

这正是SendAsync方法的userToken参数应该用于

PingOptions options = new PingOptions(10, true);
Ping thisPing = new Ping();
thisPing.SendAsync(IPAddress.Parse(IP), 100, new byte[0], options, i);
thisPing.PingCompleted += new PingCompletedEventHandler(thisPing_PingCompleted); 
...
void thisPing_PingCompleted(object sender, PingCompletedEventArgs e)
{
    var index = (int)e.UserState;
    ...
}

同样,如果您正在使用SendAsync,则不需要在每次迭代中创建Ping的实例。您可以简单地重用现有的实例,每次调用SendAsync将在不同的线程中发送ping,然后回调到您的事件处理程序,即

void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{            
    PingOptions Options = new PingOptions(10, true);
    Ping thisPing = new Ping();
    thisPing.PingCompleted += new PingCompletedEventHandler(thisPing_PingCompleted);  
    // send pings asynchronously
    for (int i = 0; i < this.View.Rows.Count; i++)
    {
        var ip = View.Rows[i].Cells[2].Value.ToString();
        thisPing.SendAsync(ip, 100, new byte[0], options, i);                  
    }
}

您可以从Ping派生,然后在Ping构造函数中传递您的参数。然后你就有了改变事件行为的所有自由,你可以根据自己的需要来改变它。

我做了一个简单的类,你可以从

开始
class ExtendedPing : Ping
{
    public delegate void ExtendedPing_Completed(object sender, PingCompletedEventArgs e, int identifier);
    public event ExtendedPing_Completed On_ExtendedPing_Completed;
    private int _i = 0;
    public ExtendedPing(int i)
    {
        _i = i;
        base.PingCompleted += ExtendedPing_PingCompleted;
    }
    void ExtendedPing_PingCompleted(object sender, PingCompletedEventArgs e)
    {
        if (On_ExtendedPing_Completed != null) 
        {
            On_ExtendedPing_Completed(sender, e, _i);
        }
    }
}

请随意阅读https://msdn.microsoft.com/en-gb/library/ms228387(v=VS.90).aspx关于继承的更多内容