我有一个代码,可以使用 SNMP 协议 1-3 通过 SnmpSharp 库扫描网络中选定的 IP,并生成新设备的事件。
// Для каждого адреса
for (int i = 0; i < Params.Ip.Length; i++)
{
// Для каждого диапозона
for (int b = Params.FromByte; b <= Params.ToByte; b++)
{
if (_stop) return;
IPEndPoint ip = new IPEndPoint(IPAddress.Parse($"{Params.Ip[i]}.{b}"), Port);
if (Params.V1)
{
Task t = Task.Run(async () => await GetV1Async(ip));
tasks.Add(t);
}
if (Params.V2)
{
Task t = Task.Run(async () => await GetV2Async(ip));
tasks.Add(t);
}
if (Params.V3)
{
Task t = Task.Run(async () => await GetV3Async(ip));
tasks.Add(t);
}
}
}
await Task.WhenAll(tasks);
该代码速度很慢;对于一个具有两种协议的 IP,它运行大约 25 秒,导致进程速度严重减慢并且窗口冻结。但是当我在 VS2022 中使用异步代码分析器(Alt+F2-> .NET Async)时,使用它我的代码运行时间减少了大约 10 倍(~2.5 秒),也就是说,冻结情况本身原则上不会发生,并且在探查器我不能。
该项目本身位于 NET 6、Avalonia 11.0.7 上
异步方法不应强制进入线程。
如果异步方法正确实现的话,那么这是
你可以而且应该这样写
这将防止对线程池的攻击,在这种情况下这是完全不必要的。因此,不应出现冻结现象。
您还可以将此作为启动大量异步任务时任何限制的示例:批量异步调用,对没有信号量的并行调用数量进行限制