【问题标题】:Repeat ping every 30 seconds每 30 秒重复一次 ping
【发布时间】:2019-09-17 09:01:32
【问题描述】:

我创建了一个 Windows 窗体 应用程序来 ping 一个 IP 地址列表,然后我使用 Timer 每隔 30 秒重复 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();                      
    }

但是我收到了这个错误信息:

错误 1 ​​'button1_Click' 没有重载匹配委托 'System.EventHandler'

我尝试了很多示例,但我不知道如何使用Timer。这里有什么问题或者有没有其他方法可以重复 Ping?

【问题讨论】:

  • button1_Click 方法的参数与编译器期望的不匹配。应该是:void button1_Click(object sender, System.EventArgs e)
  • 在那个backgroundWorker1_DoWork,你不想Sleep。激活间隔已由计时器管理。

标签: c# winforms timer ping


【解决方案1】:

请注意Button.ClickedTimer.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();
}

【讨论】:

    【解决方案2】:

    您对计时器的想法是一个完美的想法。无论如何,现在您尝试使用无法正常工作的按钮激活计时器。

    试试微软文档中的这个例子

    https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer?view=netframework-4.8

    【讨论】:

      【解决方案3】:

      查看System.EventHandlerhttps://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(相反,超类而不是子类,当然允许)。这是错误信息的意思:

      错误 1 ​​'button1_Click' 没有重载匹配委托 'System.EventHandler'

      我(编译器)期望一个方法与 System.EventHandler 的签名匹配,但没有得到。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-07
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 2012-03-26
        • 1970-01-01
        相关资源
        最近更新 更多