我有 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
谢谢你
我认为你的问题是你正在依次等待每一个任务。因此,当您有 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);