C#.NET 4.5异步ping响应被丢弃
我有一个windows窗体应用程序,可以扫描C类子网(x.y.z.1-255)并使用内置的C#.NET 4.5异步ping响应被丢弃,c#,windows,winforms,networking,.net-core,C#,Windows,Winforms,Networking,.net Core,我有一个windows窗体应用程序,可以扫描C类子网(x.y.z.1-255)并使用内置的Ping类显示在线设备。我将所有255个ping作为异步任务启动 在使用调试器运行时,我得到了我期望的所有响应(大约30个设备),但是如果我在调试器外部运行exe(调试或发布构建配置),应用程序通常只处理3或4个设备的响应,其余时间超时 运行Wireshark,我可以看到ICMP请求和响应。因此,应用程序似乎删除了响应 是否存在导致响应被丢弃的I/O/任务队列?我尝试过调整System.Threading.
Ping
类显示在线设备。我将所有255个ping作为异步任务启动
在使用调试器运行时,我得到了我期望的所有响应(大约30个设备),但是如果我在调试器外部运行exe(调试或发布构建配置),应用程序通常只处理3或4个设备的响应,其余时间超时
运行Wireshark,我可以看到ICMP请求和响应。因此,应用程序似乎删除了响应
是否存在导致响应被丢弃的I/O/任务队列?我尝试过调整System.Threading.ThreadPool.SetMinThreads(100200)
,但它似乎没有什么效果
我还尝试以Task.Factory.StartNew(async()=>{},TaskCreationOptions.longlunning)的形式运行任务代码>这似乎有帮助,但比在调试器下运行要长得多。因此,调试器似乎在运行时更改异步行为。简化代码:
private async Task RangeScan(IPAddress subnet)
{
byte[] subnetBytes = subnet.GetAddressBytes();
List<Task> allTasks = new List<Task>();
for (byte i = 1; i < 255; i++)
{
allTasks.Add(Task.Run(async () => await PingDevice(new IPAddress(new byte[] { subnetBytes[0], subnetBytes[1], subnetBytes[2], (byte)i }))));
// allTasks.Add(Task.Factory.StartNew(
// async () => await PingDevice(new IPAddress(new byte[] { startBytes[0], startBytes[1], startBytes[2], cur })),
// TaskCreationOptions.LongRunning));
}
await Task.WhenAll(allTasks);
}
private async Task PingDevice(IPAddress curIp)
{
Ping ping = new Ping();
try
{
//PingReply pr = ping.Send(curIp, 3000);
PingReply pr = await ping.SendPingAsync(curIp, 3000);
if (pr.Status != IPStatus.Success)
{
Console.WriteLine("Ping failed to {0}: {1}", curIp, pr.Status);
return;
}
Console.WriteLine("PingDevice response from {0}", curIp);
// do more async work here (HTTP request to devices which responded...)
}
catch (Exception e)
{
Console.WriteLine("PingDevice err: {0}", e);
}
专用异步任务范围扫描(IP地址子网)
{
byte[]subnetBytes=subnet.GetAddressBytes();
列出所有任务=新建列表();
用于(字节i=1;i<255;i++)
{
allTasks.Add(Task.Run(async()=>wait PingDevice)(新的IPAddress(新字节[]{subnetBytes[0],subnetBytes[1],subnetBytes[2],(byte)i}));
//添加(Task.Factory.StartNew(
//async()=>等待ping设备(新IP地址(新字节[]{startBytes[0],startBytes[1],startBytes[2],cur})),
//TaskCreationOptions.LongRunning);
}
等待任务。WhenAll(所有任务);
}
专用异步任务ping设备(IP地址curIp)
{
Ping Ping=新Ping();
尝试
{
//PingReply pr=ping.Send(curIp,3000);
PingReply pr=等待ping.SendPingAsync(curIp,3000);
if(pr.Status!=IPStatus.Success)
{
WriteLine(“Ping失败到{0}:{1}”,curIp,pr.Status);
返回;
}
WriteLine(“来自{0}的ping设备响应”,curIp);
//在此处执行更多异步工作(对响应的设备的HTTP请求…)
}
捕获(例外e)
{
WriteLine(“ping设备错误:{0}”,e);
}
因此,如果超时时间为3秒,它将在4秒内完成,在调试器下运行时,我将接收并处理所有响应。如果我使用TaskCreationOptions.longlunning
则需要20秒或更长时间,可能是因为我缺少有限的线程池。如果我做了一些愚蠢的事情,我会提前道歉,我会更聪明其他语言/Linux中的ent,但我在Windows/.NET世界中有点生疏。谢谢!检查调试和发布文件夹中的exe日期,并确保编译了调试和发布版本。什么是专用异步范围扫描(IPAddress子网)
?它是否有返回类型,或者您只是出于某种原因将其模糊了?它是void
?什么调用RangeScan()
?如何调用?顺便说一句,您不需要async()=>在那里等待所有任务。添加(PingDevice(新IPAddress(新字节[]{subnetBytes[0],subnetBytes[1],subnetBytes[2],i]));
返回类型已修复。假设从按钮单击处理程序或main()调用RangeScan
。我不确定这是否有什么不同,我试图将问题归结为基本问题。对,但有时过分归结并不能很好地为您服务。例如,当您发布和部署时,所有这些控制台。WriteLine()
是完全无用的。那么,您如何实际使用这些任务的结果?您在哪里显示、存储或记录它们?我看不到您返回任何内容。请尝试提供一个示例,让您了解整个过程。实际的示例。是的,当任务返回其结果时您所做的事情很重要。如何调用RangeScan()
需要成为问题的一部分。