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 ループに入っています。スリープはブロッキング呼び出しです。つまり、スレッドを「解放」して他の作業を続行するわけではありません。

イベントを使用した 1 つのソリューションを次に示します。

        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 に答える