C#.NET 4.5异步ping响应被丢弃

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.

我有一个windows窗体应用程序,可以扫描C类子网(x.y.z.1-255)并使用内置的
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()
需要成为问题的一部分。