向事件处理程序传递额外参数
本文关键字:参数 事件处理 程序 | 更新日期: 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关于继承的更多内容