在我的应用程序中我打开Wireshark进程并开始捕获数据包,在UI中我有启动按钮,启动捕获和停止按钮谁停止捕获,我这样做是通过杀死我的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();
}
答案 0 :(得分:2)
假设您正在使用try-catch
处理异常,您可以确保在最顶层finally
语句末尾的try-catch
块中关闭Wireshark进程。从MSDN文档:
“finally块对于清理try块中分配的任何资源非常有用。无论try块如何退出,控制总是传递给finally块。”
例如:
try
{
// Your application's code.
}
catch( Exception )
{
// Handle, log, whatever.
}
finally
{
// Make sure Wireshark process is killed.
}
无论是否存在异常,finally
块中的代码都将始终执行。
答案 1 :(得分:1)
你无法百分百肯定。如果您的应用程序以“文明”方式崩溃,您可以关闭Wireshark进程(很像@ jebar8建议)。不幸的是,您的应用程序可能会以不运行finally
代码的方式崩溃(例如,如果内存不足或主线程超出堆栈空间)。
如果您也想考虑到这一点,则需要第三个过程。编写一个小程序,启动您的应用程序并对其进行监控。如果您的应用程序进程消失,那么您的监视进程可以杀死Wirehsark它是否还活着。由于监控程序简短而简单,因此意外崩溃的可能性非常小。