【问题标题】:Pinging several servers in the same time同时ping多台服务器
【发布时间】:2014-04-11 19:20:04
【问题描述】:

我有一个列表视图,我尝试使用此代码添加服务器信息:

foreach(string element in ids)
{
   int id = Int32.Parse(element);
   ListViewItem item = new ListViewItem(name[id]);
   item.SubItems.Add(ip[id]);
   Ping pingsv = new Ping();
   PingReply pingreply = pingsv.Send(ips[id],500);
   if (pingreply.RoundtripTime == 0)
       item.SubItems.Add("500+");
   else
       item.SubItems.Add(pingreply.RoundtripTime.ToString());
}

但问题是程序一个接一个地对服务器进行 ping 操作,并且需要很长时间才能完成(我有 80 个 ip 需要 ping,将来可能还会更多) 那么有什么办法可以同时ping通所有的ip呢?

【问题讨论】:

  • 你可以使用多个线程。
  • 克罗诺,试过但没用。程序冻结,没有任何错误。
  • 您是否尝试过调试代码以查看其冻结的原因?
  • Crono,mscorlib.dll 中出现“System.Reflection.TargetInvocationException”类型的未处理异常,Application.Run(new LauncherTest()) 出现错误;
  • 信息还不够。使用您的多线程代码和完整的异常堆栈跟踪编辑您的问题,我们将从那里获取它。

标签: c# ping


【解决方案1】:

根据Ping 类,您可以使用异步事件:

foreach(string element in ids)
{
   int id = Int32.Parse(element);
   ListViewItem item = new ListViewItem(name[id]);
   item.SubItems.Add(ip[id]);
   Ping pingsv = new Ping();
   pingsv.PingCompleted += pingsv_PingCompleted;

   pingsv.SendAsync(IPAddress, 500, id);

}

[... somewhere else in the same class ...]

void pingsv_PingCompleted(object sender, PingCompletedEventArgs e)
{
      long pingtime = e.Reply.RoundtripTime;
      // do something with pingtime...

      // id has been saved to UserState (see above)
      string id = (string)e.UserState;

      // do something with id...

}

编辑:添加代码以显示添加任意数据/对象的可能性。

【讨论】:

  • +1,但要小心。它最终可能会使用比进程处理能力更多的线程。
  • 如何从 pingsv_PingCompleted 函数中的 foreach 获取 id?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 2013-11-10
  • 2011-06-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
相关资源
最近更新 更多