WinForm应用程序 - >结束过程 - > FormClosing()& FormClosed()事件未被触发

时间:2015-09-13 12:42:53

标签: c# .net winforms process formclosing

我在 FormClosing()& FormClosed()事件 对于另一个应用程序,我想强行关闭第一个这样的应用程序:

    string procId = proc.Id.ToString();

    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = "taskkill.exe";
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    startInfo.Arguments = "/f /t /pid " + procId;
    Process.Start(startInfo);

当我想通过这些代码强制关闭第一次申请或使用任务管理器 - >结束流程 FormClosing()&不会触发 FormClosed()事件。

如何在每种情况下强制执行这些事件或解决方案是什么?

2 个答案:

答案 0 :(得分:1)

Prevent C# app from process kill

您无法阻止您的应用程序进程被终止,并且您将无法获得终止它的事件。

所以你必须满足一个过程在关机时没有很好地清理的情况。就此而言,无论如何,你需要这样做,如果你的应用程序运行时机器BSOD怎么办?您永远不能假设前一个实例已成功完成。

看起来您的应用在关闭时关闭了一些数据文件,因此下次程序运行时它可以再次读取该文件。如果是这种情况,您可以在文件中或附近写一些“脏标志”,如果标记了文件,则在启动时清理文件。

How does task manager kill my program?MSDN: Terminating a Process (Windows)中所述:

  

请注意,您无法拦截或响应TerminateProcess。你的过程将会消亡,在此之前你无能为力。

     

如果进程被TerminateProcess终止,则进程的所有线程立即终止,无法运行其他代码。这意味着线程不会在终止处理程序块中执行代码。

答案 1 :(得分:0)

也许是一个愚蠢的问题,但为什么不要求应用程序自行关闭?在两个应用程序之间建立一条通信线路非常容易,让后一个应用程序通知另一个应用程序应该自行终止。

然后你就可以进行干净的关闭了。