1

我正在制作一个非常简单的程序时遇到问题。我想要它,以便当我单击 btnPing 时,它会每 1 秒向 google.com 发送一个 ping 并以毫秒为单位返回 ping。在我想循环动作之前,它工作得很好。在 while 循环之外,代码可以工作,但每次我想发送 ping 时都需要单击按钮。但是当我将代码放入循环时,它会冻结。我已经用 for 循环和 while 循环进行了尝试。该程序没有返回任何错误。是什么让我的程序冻结?

Ping pingClass = new Ping();

private void btnPing_Click(object sender, EventArgs e)
{
    while (true)
    {
        PingReply pingReply = pingClass.Send("google.com");
        rtxtPing.Text = rtxtPing.Text + "\r\n" + (pingReply.RoundtripTime.ToString() + "ms");
        System.Threading.Thread.Sleep(1000);
    }
}
4

3 回答 3

3

您正在 UI 线程上进入无限 while 循环。睡眠是一个阻塞调用,即它不会“释放”线程继续做其他工作。

这是使用事件的一种解决方案:

        public delegate void PingReceivedEventHandler(int time);

        public event PingReceivedEventHandler PingReceived;

        public Form1()
        {
            InitializeComponent();

            PingReceived += new PingReceivedEventHandler(Form1_PingReceived);
        }

        void Form1_PingReceived(int time)
        {
            //do something with val
        }

        private void button1_Click(object sender, EventArgs e)
        {
            (new Thread(() =>
                {
                    while(true)
                    {
                        int time;

                        //get value here

                        PingReceived(time);
                    }
                }
            )).Start();
        }
于 2013-05-26T19:18:47.340 回答
3

原因是您的循环阻塞了 UI,而 UI 又无法自我更新并且似乎被冻结(而实际上程序正在循环中执行 ping)。您必须在单独的线程中异步运行它(即与 UI 代码并行)。要开始使用,请参阅提供的示例。BackgroundWorker

于 2013-05-26T19:19:10.350 回答
0

由于您的 while 循环以不间断的方式执行,因此您在屏幕上看不到任何内容,感觉就像屏幕被冻结了一样。您可以通过使用Timer而不是 while 循环来获得所需的结果。我已经测试了这段代码,它工作正常。

将以下代码放在按钮单击事件中

private void button2_Click(object sender, EventArgs e)
{         

    Timer timer = new Timer { Interval = 1000, Enabled = true };
    timer.Tick += new EventHandler(PingTest);            
}

添加一个带有 ping 逻辑的方法,如下所示

public void PingTest(object sender, EventArgs e)
{
    Ping pingClass = new Ping();

    PingReply pingReply = pingClass.Send("google.com");
    rtxtPing.Text = rtxtPing.Text + "\r\n" + (pingReply.RoundtripTime.ToString() + "ms");        
}
于 2013-05-26T19:55:34.763 回答