BSODon が ping の途中でデバッグを終了するというバグに遭遇しています。
(wpf)アプリケーション(継続的にpingを実行する場所)で無効にする方法がいくつかありますが、そうするのを忘れてBSODになることがあります。
グローバルな AllowRealPinging 変数を変更し、デバッガーを終了する前にコールバックで 2 秒間スリープして、BSOD にならないようにすることで、この問題を回避したいと思います。
BSODon が ping の途中でデバッグを終了するというバグに遭遇しています。
(wpf)アプリケーション(継続的にpingを実行する場所)で無効にする方法がいくつかありますが、そうするのを忘れてBSODになることがあります。
グローバルな AllowRealPinging 変数を変更し、デバッガーを終了する前にコールバックで 2 秒間スリープして、BSOD にならないようにすることで、この問題を回避したいと思います。
これは Windows 7 の既知のバグです。プロセスを終了すると、バグ チェック コード 0x76、PROCESS_HAS_LOCKED_PAGES の tcpip.sys で BSOD が発生します。最も関連性の高いフィードバック記事はこちらです。この SO questionにも記載されています。そこには素晴らしい答えはありません。既知の唯一の回避策は、4.0 より前の .NET バージョンにフォールバックすることです。これは、ドライバーのバグをトリガーしない別の winapi 関数を使用します。
デバッグ中は ping を実行しないことが、この問題を回避する最善の方法です。希望するアプローチは機能しません。ブレークポイントに到達するとプログラムは完全にフリーズし、デバッグを停止すると kaboom になります。
最も簡単な方法は、デバッガーが接続されているという特定のケースで、最初から ping を開始しないことです。System.Diagnostic.Debugger.IsAttached プロパティを使用して、コード内でこれを検出します。
これは良い方法です:
private void GetPing(){
Dictionary<string, string> tempDictionary = this.tempDictionary; //Some adresses you want to test
StringBuilder proxy = new StringBuilder();
string roundTripTest = "";
string location;
int count = 0; //Count is mainly there in case you don't get anything
Process process = new Process{
StartInfo = new ProcessStartInfo{
FileName = "ping.exe",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true,
}
};
for (int i = 0; i < tempDictionary.Count; i++){
proxy.Append(tempDictionary.Keys.ElementAt(i));
process.StartInfo.Arguments = proxy.ToString();
do{
try{
roundTripTest = RoundTripCheck(process);
}
catch (Exception ex){
count++;
}
if (roundTripTest == null){
count++;
}
if (count == 10 || roundTripTest.Trim().Equals("")){
roundTripTest = "Server Unavailable";
}
} while (roundTripTest == null || roundTripTest.Equals(" ") || roundTripTest.Equals(""));
}
process.Dispose();
}
魔法が起こる RoundTripCheck メソッド:
private string RoundTripCheck(Process p){
StringBuilder result = new StringBuilder();
string returned = "";
p.Start();
while (!p.StandardOutput.EndOfStream){
result.Append(p.StandardOutput.ReadLine());
if (result.ToString().Contains("Average")){
returned = result.ToString().Substring(result.ToString().IndexOf("Average ="))
.Replace("Average =", "").Trim().Replace("ms", "").ToString();
break;
}
result.Clear();
}
return returned;
}
私は同じ問題を抱えていました、これはそれを解決します!