C# Непрерывный пинг - PullRequest
       6

C# Непрерывный пинг

0 голосов
/ 14 марта 2020

Я пытаюсь создать программу непрерывного пинга, которая действительно используется для устранения неполадок в нашей локальной сети. Однако у меня возникли небольшие трудности с реализацией.

Код на самом деле правильно работает. True запускает непрерывную оплату, но false не останавливает ее. Это продолжается до бесконечности. Я попробовал несколько конфигураций с другими циклами, но безуспешно.

Я не вижу, что делаю неправильно, и я надеялся, что смогу получить некоторую помощь.

Действительно ценю некоторую помощь.

Заранее спасибо.

using System.Threading;

    private void btnContinuousPing_Click(object sender, EventArgs e)
    {
        Task StillLost = Task.Factory.StartNew(() =>
        {
            bool boCheckbox = cbContinuousPing.Checked;
            while (boCheckbox == true)
            {
                PingStuff();
                Thread.Sleep(500);
                if (boCheckbox == false) // Redundant
                {
                    break;
                }
            }
        });
    }

    void PingStuff()
    {
        // Trying to build continuous ping.
        // ISSUE: While loop infinitely.
        // Setting the "cbContinuousPing.Checked" to false
        // doesn't stop the loop.
        Ping pingSender = new Ping();
        PingOptions options = new PingOptions();
        // Fragmentation behavior.
        options.DontFragment = true;
        // Set TTL to 48.
        options.Ttl = 48;
        // Create Empty buffer.
        byte[] buffer = new byte[32];
        // Wait x seconds for a reply.
        int timeout = 4000;
        // Ping device.
        PingReply reply = pingSender.Send("192.168.1.1", timeout, buffer, options);
        // Display Results.
        Invoke(new Action(() =>
        {
            txtContinuousPing.AppendText(string.Format("Address: {0}, byte={1}, time={2}, TTL={3}, Don't fragment: {4}", 
            reply.Address.ToString(), reply.Buffer.Length, reply.RoundtripTime, options.Ttl, options.DontFragment) + Environment.NewLine);
        }));
    }

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Поместите эту строку:

bool boCheckbox = cbContinuousPing.Checked;

в ваше время l oop.

0 голосов
/ 14 марта 2020

Проблема в том, что вы кэшируете значение boCheckbox один раз, вне l_1007 *, а затем внутри l oop код постоянно проверяет значение, но никогда не обновляет его.

Вместо этого вы можете рассмотреть возможность использования фактического значения (а не кэшированного значения) для условия while. Кроме того, вам также не нужна избыточная проверка внутри l oop:

private void btnContinuousPing_Click(object sender, EventArgs e)
{
    Task StillLost = Task.Factory.StartNew(() =>
    {
        while (cbContinuousPing.Checked)
        {
            PingStuff();
            Thread.Sleep(500);
        }
    });
}
...