【发布时间】:2018-10-23 06:28:36
【问题描述】:
我正在使用 winform 尝试收集网络上每个 IP 的在线/离线状态,这样做我正在使用 ping 请求,如果它回复它会将 IP 标记为在线,然后继续。唯一的问题是等待最多 255 个回复,在获得所有 255 个回复后,我希望它填充数据网格视图。
我已经设法让它全部工作,但唯一的缺点是,gui 在执行此过程时挂起,我想只需使用具有以下表达式的单独线程
Thread T1 = new Thread(PingHost)
T1.run();
PingHost 顾名思义,ping 所有主机并决定是在线还是离线。问题是我试图从线程更新 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;
【问题讨论】:
-
使用任务是不够的。您需要使用“异步/等待”。使用“.Result”只是阻塞,因此不是你想要的。
标签: c# multithreading datagridview task