这只是蓝屏显示的重要内容.我在Windows 7 x64上.
"已检测到问题,Windows已关闭,以防止损坏您的计算机.
PROCESS_HAS_LOCKED_PAGES
*STOP:0x00000076(0x0000000000000000,0xfffffa8009dcd060,0x0000000000000011,0x0000000000000000) "
我现在无法工作,因为每次关闭它都会得到一个蓝屏!除了运行下面的后台工作程序之外,该程序还没有做任何事情.它ping所有可能属于用户家庭网络的地址,并尝试连接到另一个程序将侦听的某个端口.
private void NetworkScanner_DoWork(object sender, DoWorkEventArgs e)
{
bool ExceptionEncountered = false;
int IPsProcessed = 0;
NetworkSearcherOutput = "Starting network scanner...";
NetworkSearcher.ReportProgress(0);
Thread.Sleep(1000);
foreach (IPAddress IP in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (IP.AddressFamily == AddressFamily.InterNetwork)
{
string[] Octets = IP.ToString().Split('.');
Octets[3] = "0";
IPAddress CurrentAddressIteration = StringArrayToIP(Octets);
while (GetLastOctet(CurrentAddressIteration) != 255)
{
PingReply Reply = new Ping().Send(CurrentAddressIteration, 5);
if (Reply.Status == IPStatus.Success)
{
NetworkSearcherOutput = CurrentAddressIteration.ToString() + " sent response.";
NetworkSearcher.ReportProgress(0);
Thread.Sleep(500);
InClient Client = …Run Code Online (Sandbox Code Playgroud) 编辑:我开始将此作为 PowerShell / .Net 问题提出,但在互联网上找不到任何参考。根据反馈,它似乎是一个 WINAPI 问题,因此这是一个编辑/重写/重新标记,但出于这个原因,大部分测试和背景参考 .Net。
IcmpSendEcho2如果 ping 超时参数设置为低于 1000 毫秒(1 秒),则WINAPI ping 函数似乎存在计时错误。这会导致它返回间歇性假超时错误。而不是成比例的“较低超时 = 更多失败”行为,它似乎是 >=1000ms+ 的预期行为,<=999ms 触发错误超时,通常以交替的成功/失败/成功/失败模式。
我称它们为假超时,因为我有 WireShark 数据包捕获显示回复数据包在超时内很好地返回,部分原因是当回复通常有 500-800 毫秒的余量时,1 毫秒的变化不应该是很长的时间,部分原因是因为我可以同时运行两组具有不同超时的 ping 并看到两者之间的不同行为。
在我原来的 .Net 问题的评论中,@wOxxOm 有:
UnsafeNetInfoNativeMethods.IcmpSendEcho2()和@Lieven Keersmaekers 调查并发现了超出我技能水平的东西来解释:
“我可以认为这是一个潜在的 WINAPI 问题。在成功和超时调用之后IPHLPAPI!IcmpSendEcho2Ex:000003e7参数在堆栈上,两者都设置一个事件并返回到IPHLPAPI!IcmpEchoRequestComplete成功调用的 eax 寄存器包含00000000的差异和超时调用的 eax包含00000102(WAIT_TIMEOUT) 的寄存器
“编译 64 位 C# 版本,不再调用IPHLPAPI. 显示的一致的事情是clr.dll GetLastError()返回WSA_QOS_ADMISSION_FAILURE超时。在我的示例中也一致的是成功和超时调用之间的线程执行顺序略有不同。”
WSA_QOS_ADMISSION_FAILURE可能是一个误导性错误,实际上是IP_REQ_TIMED_OUT. …是否有一个选项/属性/...可以阻止 VS 的调试器停止特定方法内的调试会话?我这样问是因为我正遭受 .NET 4.0 类有时会触发的 BSoD 之苦Ping。有关详细信息,请参阅使用 Ping 时出现蓝屏。
private async Task<PingReply> PerformPing()
{
// Do not stop debugging inside the using expression
using (var ping = new Ping()) {
return await ping.SendTaskAsync(IPAddress, PingTimeout);
}
}
Run Code Online (Sandbox Code Playgroud)