【问题标题】:Get IP Ping results Asynchronously c#异步获取 IP Ping 结果 c#
【发布时间】:2015-07-16 05:27:34
【问题描述】:

我有一个 IP 地址列表。我想立即对所有这些启动一个 ping 过程,并且应该是异步的。

private async Task<List<PingReply>> PingAsync()
{
   Ping pingSender = new Ping();
  var tasks = theListOfIPs.Select(ip => pingSender.SendPingAsyn(ip,2000));
   var results = await Task.WhenAll(tasks);

   return results.ToList();
}

据我了解,此操作将等到返回所有 ping 结果。我想要做的是,每当完成一个结果时,我都想利用该结果。因此,即一旦一个 ping 返回结果,我想立即存储它,而无需等待其他 ping 完成。

我该怎么做?

【问题讨论】:

  • 您可以使用 Task.WaitAny 并循环直到所有任务完成

标签: c# asp.net asynchronous ip ping


【解决方案1】:

我想做的是每当完成一个结果时,我想利用该结果。

我认为最干净的解决方案是定义一个“ping and process”操作:

private async Task<PingReply> PingAndProcessAsync(Ping pingSender, string ip)
{
  var result = await pingSender.SendPingAsync(ip, 2000);
  ProcessPingResult(result);
  return result;
}

然后同时运行多个:

private async Task<List<PingReply>> PingAsync()
{
  Ping pingSender = new Ping();
  var tasks = theListOfIPs.Select(ip => PingAndProcessAsync(pingSender, ip));
  var results = await Task.WhenAll(tasks);
  return results.ToList();
}

【讨论】:

  • 这正是我想要的。
  • 用法示例?似乎在所有任务实际完成之前退出并继续。
  • @Tsukasa:是的。因为它是异步的。
  • 判断所有任务何时完成或是否需要采用不同方法的最佳方法。
  • @Tsukasa:你会使用await,像这样:await PingAsync();
【解决方案2】:

在这种情况下你可以使用 WaitAny

  var results = await Task.WaitAny (tasks);

以下版本是记录器,但我认为这可能会对您有所帮助..

bool onetaskCompleted= false;
private readonly Object obj = new Object();

private async Task<List<PingReply>> PingAsync()
{
   Ping pingSender = new Ping();
   var tasks = theListOfIPs.Select(ip => pingSender.SendPingAsyn(ip,2000));
   List<Task> continuetask = new List<Task>();
   foreach(Task t in taks)
   {
     continuetask.Add(t.ContinueWith(Action));
   }

   var results = await Task.WhenAll(continuetask);

   return results.ToList();
}

private void ContinuationAction()
{
     lock(obj)
     {
       if(!onetaskCompleted) 
          onetaskCompleted = true;
     }
     if(!onetaskCompleted)
     {
       //execute code 
     }
}

【讨论】:

  • 感谢您的快速回复。我会试试这个。我想以这种方式对其进行编码,以便它在尽可能快的时间内响应我,因为我想根据这些结果向地图添加标记。如果我使用 WaitAny,它会在 ping 返回时触发任何事件。
  • @SachinTrivedi - 这就是我建议您尝试第二种解决方案的原因,因为这将允许您继续...如果适合您,请不要忘记将其标记为接受/赞成
  • 谢谢。我在这里遇到错误 continuetask.Add(t.ContinueWith(Action));应该用什么来代替“Action”?
  • @SachinTrivedi - 动作替换为方法...你可以查看 msdn 你会在这里得到答案 ContinueWith((t)=> ContinueAction())
  • 抱歉,我不清楚如何在 ContinuationAction 中获得 ping 结果?您能否发布完整的工作代码。 as var results = await Task.WhenAll(continuetask);返回编译错误。
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多