C# Ping 太慢了

问题描述 投票:0回答:1

我有 167 个 IP 需要 ping。我将超时设置为 100 毫秒或 1 毫秒,无论我设置什么,我

async/await
,没有
async/await
,有
Task.Run()
都大约相同的结果,大约 80 秒!!!!

List<PingResult> res = new List<PingResult>();
var model = await _toyCityService.GetToyCityViewModel();
foreach (var item in model)
{
    if (!string.IsNullOrEmpty(item.DevIPWIFI))
    {
        bool? pingable = false;

        try
        {
            PingReply reply = await Task.Run(() => new Ping().SendPingAsync(item.DevIPWIFI,100));
            if (reply.Status == IPStatus.Success)
            {
                long LastDateTimeRec = (item.LastDateTimeRec == null ? 0 : Convert.ToInt64(item.LastDateTimeRec));
                var timeMinusFive = DateTime.Now.AddMinutes(-5).ToFileTime();
                if (timeMinusFive < LastDateTimeRec)
                    pingable = true;
                else
                    pingable = null;
            }
            else
            {
                pingable = false;
            }
        }
        catch
        {
            pingable = false;
        }
        res.Add(new PingResult()
        {
            Id = item.ID,
            IP = item.DevIPWIFI,
            Status = pingable
        });
    }
}
return res;

我已经用这些进行了测试:

PingReply reply = await new Ping().SendPingAsync(item.DevIPWIFI,100);

PingReply reply = new Ping().Send(item.DevIPWIFI,100);

PingReply reply = await Task.Run(() => new Ping().SendPingAsync(item.DevIPWIFI,100,buffer,pingOptions));

我不得不提的是从

foreach
起点到返回所花费的时间,从这167个IP中,大多数像其中160个超时,我知道这一点! 但我将超时设置为 1ms 和 100ms。假设是 100,那么在最坏的情况下,应该需要大约 20 秒而不是 80 到 100 秒!您可以使用网络中 160 个超时的 IP 进行测试。

我还在

PingReply
上设置了断点,看看一切进展如何,一切都进展顺利且快!所有代码不仅仅是 ping 本身。

现在计算1ms!甚至不需要一秒钟。

我正在使用最新的 VS2022、Dotnet SDK 8.0.5 和 ASP.Net Core MVC

谢谢你

c# .net asp.net-core ping
1个回答
0
投票

我认为你的问题是你正在依次等待每一个任务。因此,当您有 100 个任务时,您可以在第一个任务完成后有效地触发第二个任务。

您似乎需要的是同时触发所有这些任务并等待所有任务完成。为此,请将每个任务添加到

List<Task>
并使用
await [Task.WhenAll](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenall?view=net-8.0)

var list = new List<Task>();
foreach(var m in model)
{
    list.Add(new Ping().SendAsync(...));  // no await here
}
await Task.WhenAll(list);
© www.soinside.com 2019 - 2024. All rights reserved.