1

私のアプリケーションでは、Wiresharkプロセスを開き、packtsのキャプチャを開始します。UIには、キャプチャを開始する[スタート]ボタンと、キャプチャを停止する[Stop]ボタンがあり、wiresharkプロセスを強制終了します。私の質問は、キャプチャの途中でアプリケーションを閉じても、[停止]ボタンを使用してもWiresharkプロセスが実行され続ける場合、この状況を処理し、アプリケーションがクラッシュしたり誰かが閉じたりした場合にプロセスを確実に閉じるにはどうすればよいですか?キャプチャの途中で

public void startCapturing()
{            
    ThreadStart tStarter = delegate { openAdapterForStatistics(_device); };
    Thread thread = new Thread(tStarter);
    thread.IsBackground = true;
    thread.Start();
    ProcessStartInfo tsharkStartInfo = new ProcessStartInfo();
    tsharkStartInfo.FileName = _tshark; 
    tsharkStartInfo.RedirectStandardOutput = true; 
    tsharkStartInfo.RedirectStandardError = true; 
    tsharkStartInfo.RedirectStandardInput = true; 
    tsharkStartInfo.UseShellExecute = false; 
    tsharkStartInfo.CreateNoWindow = true; 
    tsharkStartInfo.Arguments = string.Format(" -i " + _interfaceNumber + " -s " + _packetLimitSize + " -w " + _pcapPath);
    _tsharkProcess.StartInfo = tsharkStartInfo;
    _tsharkProcess.ErrorDataReceived += _cmdProcess_ErrorDataReceived;
    _tsharkProcess.OutputDataReceived += tshark_OutputDataReceived; 
    _tsharkProcess.EnableRaisingEvents = true; 
    _tsharkProcess.Start();
    _tsharkProcess.BeginOutputReadLine(); 
    _tsharkProcess.BeginErrorReadLine();                  
    FileInfo fileInfo = new FileInfo(_pcapPath);
    string directoryName = fileInfo.DirectoryName;
    DirectoryInfo directoryInfo = new DirectoryInfo(directoryName);
    FileInfo[] dirs = directoryInfo.GetFiles();
    _file = dirs.FirstOrDefault(f => f.Name.Equals(fileInfo.Name));
    _tsharkProcess.WaitForExit(); 
}
4

2 に答える 2

2

を使用して例外を処理していると仮定すると、最上位のステートメントの最後にあるブロックでtry-catchWiresharkプロセスが閉じられていることを確認できます。MSDNドキュメントから:finallytry-catch

「finallyブロックは、tryブロックに割り当てられたリソースをクリーンアップするのに役立ちます。tryブロックの終了方法に関係なく、制御は常にfinallyブロックに渡されます。」

例えば:

try
{
    // Your application's code.
}
catch( Exception )
{
    // Handle, log, whatever.
}
finally
{
    // Make sure Wireshark process is killed.
}

ブロック内のコードfinallyは、例外があったかどうかに関係なく常に実行されます。

于 2012-10-13T20:52:58.237 に答える
1

100%確信することはできません。アプリケーションが「文明化された」方法でクラッシュした場合は、Wiresharkプロセスを閉じることができます(@ jebar8が提案したように)。残念ながら、アプリケーションがコードを実行しない方法でクラッシュする可能性がありますfinally(たとえば、メモリ不足やメインスレッドのスタックスペース不足の場合)。

それも考慮に入れたい場合は、3番目のプロセスが必要です。アプリケーションを起動して監視する小さなプログラムを作成します。アプリケーションプロセスが消えた場合、監視プロセスはWirehsarkを強制終了する可能性があります。監視プログラムは短くて単純なものであるため、予期せずクラッシュする可能性は非常に低くなります。

于 2012-10-13T21:51:56.737 に答える