c# - 为什么 WhenAll 无限期地等待多个 ping?

标签 c# .net multithreading ping

我的应用程序需要 ping 网络中所有可能的 IP 地址。由于 IP 列表很大(大约 4000 个条目),我决定异步执行 ping 以加快进程。我编写的代码最初似乎运行良好,但不知何故,当我昨天尝试它时,它不再按预期运行(也许在一些 .NET 更新之后?我真的不知道)。

我的代码是这样工作的:我从 IP 地址列表创建了一个任务列表(每个 IP 一个),然后将任务列表传递给 WhenAll 以等待所有 ping 请求完成。问题是有时 WhenAll 会无限期地等待(我用调试器检查过,我看到一些传递给 WhenAll 的任务总是保持在“等待激活”状态)。奇怪的是,有时(3 次测试中大约有 2 次)它按预期工作并且所有任务都完成。

这是我使用的代码:

    public static async Task<List<PingReply>> PingAsync(List<IPAddress> ips, int timeout)
     {
         var pingTasks = ips.Select(ip =>
         {
             using (Ping ping = new Ping())
             {
                 return ping.SendPingAsync(ip, timeout);
             }
         });
    
         var results = await Task.WhenAll(pingTasks);
    
         return results.ToList();
     }

关于问题可能是什么的任何提示?

最佳答案

问题可能是您在从 SendPingAsync 返回的 Task 完成之前处理 ping。这会很刺激,这也许可以解释为什么您会看到这种情况不可预测地发生。

在处理 ping 之前尝试等待该 Task:

public static async Task<List<PingReply>> PingAsync(List<IPAddress> ips, int timeout)
{
    var pingTasks = ips.Select(async ip =>
    {
        using (Ping ping = new Ping())
        {
            return await ping.SendPingAsync(ip, timeout);
        }
    });

    var results = await Task.WhenAll(pingTasks);

    return results.ToList();
}

关于c# - 为什么 WhenAll 无限期地等待多个 ping?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64571060/

相关文章:

c# - 使用 Mono.Cecil 从 ByReferenceType 获取通用参数

python - 如何使用pytest基于服务器输出测试客户端-服务器交互?

c# - 十进制三进制不起作用

c# - 使用游标从使用 C# 的 SQL Server 读取时间序列数据?

c# - 如何自动保存和自动加载 winforms C# 中的所有属性?

c# - 如何从 Azure 函数返回 AcceptedAtRouteResult?

.net - CheckListBox - 根据数组值检查项目 - VB.NET

.net - 在 Crystal Reports 中模拟

javascript - 调用window.setInterval会在chrome中打开一个新线程吗?

c# - .NET JIT 编译器可变优化