如何确保我启动的进程将关闭我的应用程序崩溃

时间:2012-10-13 20:34:39

标签: c# winforms

在我的应用程序中我打开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(); 
}

2 个答案:

答案 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它是否还活着。由于监控程序简短而简单,因此意外崩溃的可能性非常小。