我有以下C#代码:

 static void Main(string[] args)
        {
            IPAddress ip = IPAddress.Parse("10.131.88.160");
            int timeout =800;

            Ping pinger = new Ping();

            while (true)
            {
              
                PingReply reply = pinger.Send(ip, timeout, buffer);
                Console.WriteLine(reply.Status);
                Console.WriteLine(Convert.ToString(reply.RoundtripTime));
                Thread.Sleep(1000);
            }

应与以下批次具有相同的功能:

@echo off

cls

set ip=10.131.88.160

:schleife

 ping %ip% -n 1 -w 800 

 timeout /t 1 /nobreak > nul

goto schleife

使用C#的ping测试每3~4次try 失败一次,但使用Batch时每次try 都成功.

有人知道造成这种情况的原因吗?

我try 了其他IP地址,也取得了相同的结果. 批处理文件总是有效的,C#有时会失败.

推荐答案

如果您深入研究Ping类的.NETsource,它将通过调用低级IcmpSendEcho2函数来操作.已经观察到将timeout设置为低于1000 seems to be unreliable的值.

你可以自己测试一下.在您的代码集timeout=999中,可以看到间歇性故障.现在试着用timeout=1000,它们很可能会消失.

至于为什么ping -w 800cmd工作更好,这是一个谜.但最好的猜测是,它调用了一个不同的低级函数,或者它实际上并不尊重你给它的超时时间.

Csharp相关问答推荐

在C# 11之前, struct 中的每个字段都必须显式分配?不能繁殖

Blazor:用参数创建根路径

为什么xslWriter不总是按照xslWriterSet中指定的格式格式化该文档?

Serilog SQL服务器接收器使用UTC作为时间戳

图形.DrawString奇怪异常的字距调整

向类注入一个工厂来创建一些资源是一个好的实践吗?

当通过Google的Gmail Api发送邮件时,签名会产生dkim = neutral(正文散列未验证)'

查找表中的模式

如何使用新的Microsoft.IdentityModel.JsonWebToken创建JwtSecurityToken?

Thad.Sept()vs Task.Delay().Wait()

EF核心区分大小写的主键

在DoubleClick上交换DataGridViewImageColumn的图像和工具提示

记录类型';==运算符是否与实现IEquatable<;T&>;的类中的';equals&>方法执行等价比较?

链接到字典字符串.拆分为(.Key,.Value)

未在Windows上运行的Maui项目

未显示详细信息的弹出对话框

数据库操作预计影响1行,但实际影响0行; after _dbContext.SaveChanges();

映射器-如何映射到多个实体

使用SQL Server 2022+时,我是否必须将代码从SqlConnection类对象中迁移出来?

如何查找Span;T&>是否包含相同顺序的其他Span<;T&>