【问题标题】:WinForm Application -> End Process -> FormClosing() & FormClosed() events Not FiredWinForm 应用程序 -> 结束进程 -> FormClosing() & FormClosed() 事件未触发
【发布时间】:2015-09-13 12:42:53
【问题描述】:

我在 FormClosing()FormClosed() 事件中有一个已启动的 win-form 应用程序。
对于另一个应用程序,我想像这样强制关闭第一个应用程序:

    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);

当我想通过这些代码强制关闭第一个应用程序或使用 Task Manager -> End ProcessFormClosing()FormClosed() strong> 事件不会被触发。

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

【问题讨论】:

  • 如果您的进程被杀死,您将无能为力。 为什么您希望该代码运行?你不能在下次启动时清理被杀死的实例吗?
  • 没有人,在启动和关闭时,我有不同的代码用于在文件中写入一些数据。我不能改变它们!
  • 一般来说,要么等到下次启动,要么告诉进程你将要杀死它并允许它事先执行操作(假设这两个进程都在你的控制之下)。
  • @Ehsan Sajjad 该线程在 ConsoleApplication 中模拟 Form_Closing() 事件,在 winforms 中我们有该事件。只需要在每次终止时运行它。

标签: c# .net winforms process formclosing


【解决方案1】:

Prevent C# app from process kill

您无法阻止应用程序的进程被终止,并且您不会收到正在终止的事件。

因此,您必须应对进程在关闭时没有很好地清理的情况。就此而言,无论如何您都需要这样做,如果在您的应用程序运行时机器蓝屏怎么办?您永远不能假设前一个实例成功完成。

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

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

请注意,您不能拦截或对 TerminateProcess 做出反应。您的进程将会终止,在此之前您无能为力。

如果一个进程被 TerminateProcess 终止,则该进程的所有线程都将立即终止,没有机会运行其他代码。这意味着线程不会执行终止处理程序块中的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2019-07-26
    • 2016-05-10
    • 2016-06-18
    相关资源
    最近更新 更多