Как записать найденные ip адреса в локальной сети, в List?

Всем привет!

Я получила список доступных ip адресов в локальной сети. Мне нужно сохранить их в лист для дальнейшего использования. Но сохранить в лист через pingcomplited не получается. Как можно это сделать?

Вот часть моего кода:

Объявляю глобально

private List<string> servers = new List<string>();

После чего идёт асинхронный пинг (функция FindServers)

for (int i = 1; i < 255; i++)
            {
                IPAddress ip = IPAddress.Parse(ipBase + i);

                System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();

                ping.PingCompleted += p_PingCompleted;
                PingOptions options = new PingOptions(64, true);
                ping.SendAsync(ip, 100, buffer, options, waiter);
            }

И p_PingCompleted

if (e.Reply.Status == IPStatus.Success)
        {
            //**в консоль выводится без проблем**
            //UnityEngine.Debug.Log("Ping successed on IP: " + e.Reply.Address.ToString());

            //**вот здесь пытаюсь сохранить в лист, но он всегда остаётся пустым**
            servers.Add("Ping successed on IP: " + e.Reply.Address.ToString());

            //продолжает главный поток
            ((AutoResetEvent)e.UserState).Set();
        }

UPDATE: Функция ClientStart, вызывается при запуске игры

private void ClientStart()
    {
        FindServers();

        if (servers.Count != 0)
        {
            for (int i = 1; i < servers.Count; i++)
                UnityEngine.Debug.Log(servers[i]);
        }
        else
        {
            UnityEngine.Debug.Log("nope");
        }
    }

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

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

Во-первых, потокобезопасность

lock (servers)
    servers.Add("Ping successed on IP: " + e.Reply.Address.ToString());

Во-вторых, вы пытаетесь прочитать список до того как он будет пополнен.

Заведите счетчик

private int pingCount;

И увеличивайте его

if (e.Reply.Status == IPStatus.Success)
{
    // ...
}
int count = Interlocked.Increment(ref pingCount);
if (count == 255)
{
    // все пинги закончились, здесь и надо выполнять код чтения списка, или не раньше, чем вы попадете сюда
    if (servers.Count != 0)
    {
        for (int i = 1; i < servers.Count; i++)
            UnityEngine.Debug.Log(servers[i]);
    }
    else
    {
        UnityEngine.Debug.Log("nope");
    }
}
→ Ссылка