Почему разный результат проверки списка C#?

прошу помочь сообщество с программой Эта программа предназначена для массовой проверки доступности IP адресов. Загрузка адресов происходит в ListBox "Загруженные IP" из txt файла, после нажатия кнопки "Ping" IP должны пропинговаться и доступные адреса добавиться в другой ListBox "Доступные IP", а недоступные записаться в Log (пока не реализовано), однако, несмотря на частичную работу программы -- результат непредсказуемый. В ListBox "Доступные IP" либо не попадают адреса совсем (все адреса в списке 100% доступны), либо после многократного нажатия на "Ping" попадают в разном количестве.

введите сюда описание изображения

namespace AOConfig
{
    public partial class MassScript : Form
    {
        
        public MassScript()
        {
            InitializeComponent();
        }

        private void OpenFileBtn_Click(object sender, EventArgs e)
        {
            SourceList.Items.Clear();
            using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Text Documents(*.txt)|*.txt", ValidateNames = true, Multiselect = false })
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    string[] switchList = System.IO.File.ReadAllLines(ofd.FileName,Encoding.UTF8);
                    SourceList.Items.AddRange(switchList);
                    TotalCount_label.Text = SourceList.Items.Count.ToString();
                }
            }
        }

        private void StartPingBtn_Click(object sender, EventArgs e)
        {
            Ping switchPing = new Ping();
            PingReply pingReply = null;
            PingOptions options = new PingOptions();
            options.DontFragment = true;
            // options.Ttl = 64;
            int timeout = 100;
            foreach (var Item in SourceList.Items)
            {
                string Host = SourceList.GetItemText(Item);
                byte[] buffer = Encoding.ASCII.GetBytes(Host);
                pingReply = switchPing.Send(Host, timeout, buffer, options);

                if (pingReply.Status == IPStatus.Success)
                {
                    LiveList.Items.Add(Host);
                    LiveCount_label.Text = LiveList.Items.Count.ToString();
                }
                else
                {
                    break;
                }
            }
        }
    }
}


Ответы (1 шт):

Автор решения: Nesty

Для работы в публичных сетях, необходимо поставить int timeout побольше, цикл не обрывать. Рабочий код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Net.NetworkInformation;

namespace AOConfig
{
    public partial class MassScript : Form
    {
        
        public MassScript()
        {
            InitializeComponent();
        }

        private void OpenFileBtn_Click(object sender, EventArgs e)
        {
            SourceList.Items.Clear();
            using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Text Documents(*.txt)|*.txt", ValidateNames = true, Multiselect = false })
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    string[] switchList = System.IO.File.ReadAllLines(ofd.FileName,Encoding.UTF8);
                    SourceList.Items.AddRange(switchList);
                    TotalCount_label.Text = SourceList.Items.Count.ToString();
                }
            }
        }

        private void StartPingBtn_Click(object sender, EventArgs e)
        {
            Ping switchPing = new Ping();
            PingReply pingReply = null;
            PingOptions options = new PingOptions();
            options.DontFragment = true;
            // options.Ttl = 64;
            int timeout = 1000; // время ожидания ответа 1 сек
            foreach (var Item in SourceList.Items)
            {
                string Host = SourceList.GetItemText(Item);
                byte[] buffer = Encoding.ASCII.GetBytes(Host);
                pingReply = switchPing.Send(Host, timeout, buffer, options);

                if (pingReply.Status == IPStatus.Success)
                {
                    LiveList.Items.Add(Host);
                    LiveCount_label.Text = LiveList.Items.Count.ToString();
                }
                else
                {
                    continue; // не прерываем цикл
                }
            }
        }
    }
}

→ Ссылка