Я использую winform, чтобы попытаться собрать статус онлайн / офлайн каждого IP в сети, поэтому я использую запрос ping, если он отвечает, он помечает IP как онлайн, а затем переходит.Единственная проблема - ожидание до 255 ответов, после получения всех 255 ответов. Я хочу, чтобы он заполнил представление таблицы данных.
Мне удалось заставить все это работать, но единственным недостатком является то, что графический интерфейс зависаетвыполняя этот процесс, я решил использовать отдельный поток со следующим выражением
Thread T1 = new Thread(PingHost)
T1.run();
PingHost делает, как следует из названия, пингует все хосты и решает, подключен он или нет.Проблема в том, что я пытался обновить таблицу dgv из потока, естественно, dgv заблокирован в главном потоке.
Поэтому я попытался переключиться на задачу и просто получить возвращаемое значение и обновить после того, как все будет завершено.К сожалению, я не могу понять, как получить возвращаемое значение из задачи и запустить его в отдельном потоке.
Я пробовал прибегать к поиску различных методов, но на данный момент я просто бегаю кругами, поэтому ясмиренно приходите к вам, ребята, за помощью
Код основного потока с использованием задач
List<string> everything = new List<string>();
int i = 0;
Task<List<string>> task1 = Task<List<string>>.Factory.StartNew(PingHost);
everything = task1.Result;
foreach(var item in everything)
{
var index = dataGridView1.Rows.Add();
dataGridView1.Rows[i].Cells["IP"].Value = item;
i++;
}
И это поток моего метода PingHost
bool pingable = false;
Ping pinger = null;
int i = 0;
string ip;
while (i < 255)
{
ip = "192.168.0." + i;
try
{
pinger = new Ping();
PingReply reply = pinger.Send(ip, 8);
pingable = reply.Status == IPStatus.Success;
}
catch (PingException)
{
MessageBox.Show("ERROR");
// Discard PingExceptions and return false;
}
finally
{
if (pinger != null)
{
pinger.Dispose();
}
}
if (pingable)
{
checkedIP.Add(ip + ": ONLINE");
}
else
{
checkedIP.Add(ip + ": OFFLINE");
}
i++;
}
return checkedIP;