每 30 秒重复一次 ping
Repeat ping every 30 seconds
我创建了一个 Windows Forms 应用程序来 ping 一个 IP 地址列表,然后我使用 Timer
每隔 [=12] 重复一次 ping =]秒。这是我使用的代码:
private System.Timers.Timer timer;
public Form1()
{
InitializeComponent();
timer = new System.Timers.Timer();
timer.Interval = 30000;
timer.Enabled = true;
timer.Elapsed += button1_Click;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
pingResults.Clear();
ipAddress.Add("10.100.1.1");
ipAddress.Add("10.100.1.2");
ipAddress.Add("10.100.1.3");
ipAddress.Add("10.100.1.4");
ipAddress.Add("10.100.1.5");
ipAddress.Add("10.100.1.100");
for (int i = 1; i < 7; i++)
{
pictureBoxList.Add((PictureBox)Controls.Find("pictureBox" + i, true)[0]);
}
Parallel.For(0, ipAddress.Count(), (i, loopState) =>
{
Ping ping = new Ping();
PingReply pingReply = ping.Send(ipAddress[i].ToString());
this.BeginInvoke((Action)delegate()
{
pictureBoxList[i].BackColor = (pingReply.Status == IPStatus.Success) ? Color.Green : Color.Red;
});
});
}
private void button1_Click(object sender,ElapsedEventArgs e )
{
backgroundWorker1.RunWorkerAsync();
}
但我收到此错误消息:
Error 1 No overload for 'button1_Click' matches delegate 'System.EventHandler'
我尝试了很多例子,但我不知道如何使用 Timer
。这里有什么问题,或者有没有其他方法可以重复 Ping?
你关于计时器的想法是个完美的想法。无论如何,现在您尝试使用无法正常工作的按钮来激活计时器。
试试微软文档中的这个例子
https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer?view=netframework-4.8
请注意 Button.Clicked
和 Timer.Elapsed
有 不同的签名 ;你,可能,想要
public Form1()
{
InitializeComponent();
timer = new System.Timers.Timer();
timer.Interval = 30000;
timer.Enabled = true;
timer.Elapsed += timer_Elapsed; // not button1_Click
}
...
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
或者您可以借助 lambda 函数:
完全摆脱 timer_Elapsed
public Form1()
{
InitializeComponent();
timer = new System.Timers.Timer();
timer.Interval = 30000;
timer.Enabled = true;
timer.Elapsed += (s, e) => {backgroundWorker1.RunWorkerAsync();};
}
...
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
查看 System.EventHandler
的定义(在 https://docs.microsoft.com/en-us/dotnet/api/system.eventhandler?view=netframework-4.8),我们看到它是:
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public delegate void EventHandler(object sender, EventArgs e);
它是一个委托,接受一个 System.EventArgs
类型的参数和一个 object
类型的参数。查看您的代码:
private void button1_Click(object sender, ElapsedEventArgs e)
我们看到您的事件处理程序收到 object
和 ElapsedEventArgs
,它们是 EventArgs
的子类。但是你不能使用它,因为编译器期望 EventArgs
(相反,超类而不是子类,当然允许)。这是错误信息的意思:
Error 1 No overload for 'button1_Click' matches delegate 'System.EventHandler'
我(编译器)期望一个方法匹配 System.EventHandler
的签名,但没有。
我创建了一个 Windows Forms 应用程序来 ping 一个 IP 地址列表,然后我使用 Timer
每隔 [=12] 重复一次 ping =]秒。这是我使用的代码:
private System.Timers.Timer timer;
public Form1()
{
InitializeComponent();
timer = new System.Timers.Timer();
timer.Interval = 30000;
timer.Enabled = true;
timer.Elapsed += button1_Click;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
pingResults.Clear();
ipAddress.Add("10.100.1.1");
ipAddress.Add("10.100.1.2");
ipAddress.Add("10.100.1.3");
ipAddress.Add("10.100.1.4");
ipAddress.Add("10.100.1.5");
ipAddress.Add("10.100.1.100");
for (int i = 1; i < 7; i++)
{
pictureBoxList.Add((PictureBox)Controls.Find("pictureBox" + i, true)[0]);
}
Parallel.For(0, ipAddress.Count(), (i, loopState) =>
{
Ping ping = new Ping();
PingReply pingReply = ping.Send(ipAddress[i].ToString());
this.BeginInvoke((Action)delegate()
{
pictureBoxList[i].BackColor = (pingReply.Status == IPStatus.Success) ? Color.Green : Color.Red;
});
});
}
private void button1_Click(object sender,ElapsedEventArgs e )
{
backgroundWorker1.RunWorkerAsync();
}
但我收到此错误消息:
Error 1 No overload for 'button1_Click' matches delegate 'System.EventHandler'
我尝试了很多例子,但我不知道如何使用 Timer
。这里有什么问题,或者有没有其他方法可以重复 Ping?
你关于计时器的想法是个完美的想法。无论如何,现在您尝试使用无法正常工作的按钮来激活计时器。
试试微软文档中的这个例子
https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer?view=netframework-4.8
请注意 Button.Clicked
和 Timer.Elapsed
有 不同的签名 ;你,可能,想要
public Form1()
{
InitializeComponent();
timer = new System.Timers.Timer();
timer.Interval = 30000;
timer.Enabled = true;
timer.Elapsed += timer_Elapsed; // not button1_Click
}
...
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
或者您可以借助 lambda 函数:
完全摆脱timer_Elapsed
public Form1()
{
InitializeComponent();
timer = new System.Timers.Timer();
timer.Interval = 30000;
timer.Enabled = true;
timer.Elapsed += (s, e) => {backgroundWorker1.RunWorkerAsync();};
}
...
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
查看 System.EventHandler
的定义(在 https://docs.microsoft.com/en-us/dotnet/api/system.eventhandler?view=netframework-4.8),我们看到它是:
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public delegate void EventHandler(object sender, EventArgs e);
它是一个委托,接受一个 System.EventArgs
类型的参数和一个 object
类型的参数。查看您的代码:
private void button1_Click(object sender, ElapsedEventArgs e)
我们看到您的事件处理程序收到 object
和 ElapsedEventArgs
,它们是 EventArgs
的子类。但是你不能使用它,因为编译器期望 EventArgs
(相反,超类而不是子类,当然允许)。这是错误信息的意思:
Error 1 No overload for 'button1_Click' matches delegate 'System.EventHandler'
我(编译器)期望一个方法匹配 System.EventHandler
的签名,但没有。