正确的运行、终止和保持进程运行的方法

22 浏览
0 Comments

正确的运行、终止和保持进程运行的方法

在我的应用程序中,使用另一个在托盘中运行的应用程序来打印收据,我需要做以下三件事:

  • 在主应用程序启动时打开进程
  • 在主应用程序关闭或更改打印机的任何信息时关闭进程
  • 如果出现错误,保持进程活动

第一个点很简单,我只需要简单地执行以下代码:

Process.Start("_ReceiptPrinter.exe");

进程就会运行起来 😉

但是现在,还有另外两个问题:

  • 关闭进程。我尝试了以下代码:

    Process[] allProcs = Process.GetProcesses();
    foreach (Process proc in allProcs)
    {
        ProcessThreadCollection myThreads = proc.Threads;
        if (proc.ProcessName == "_ReceiptPrinter")
        {
            proc.Close();
        }
    }
    

不幸的是,我仍然可以在托盘中看到图标,并且进程仍在运行。

  • 保持进程活动。我的主应用程序是使用WPF编写的,而托盘中的应用程序是使用WinForms编写的。也许有一种方式可以处理任何 WinForm 应用程序的退出事件(除了从另一个应用程序简单地关闭它的这种情况),然后重新打开它?
0
0 Comments

正确运行、关闭和保持进程运行的方法

你仍然看到托盘图标的原因是图标被外部进程(Windows资源管理器)缓存了。

process.Close()不能关闭应用程序的原因是应用程序没有处理窗口消息(因为这个调用模拟了一个经典的Windows API的WM_CLOSE请求)。

正确关闭应用程序的方法是使用process.Close(),而不是process.Kill(),此外,作为应用程序/窗口关闭的一部分,你需要取消注册任何你已经在系统中注册的托盘图标。这样,任何应用程序的正常关闭都将正确清理托盘。

此外,你可以使用“关键的终结器”,它将在应用程序退出之前保证运行,除非发生灾难性的情况。

0
0 Comments

问题的出现原因:在关闭进程时,使用proc.Close()方法无法保证进程一定会关闭。

解决方法:使用proc.Kill()方法来强制关闭进程。

进一步讨论中,询问者想要实现的功能是:当WPF应用程序出现错误时,保持托盘应用程序的运行状态。

解决方法:添加一个后台进程,每隔几秒钟检查托盘应用程序是否在运行。将托盘应用程序设置为在出现错误时终止。然后,在WPF应用程序中,如果发现托盘应用程序未运行,则简单地重新启动它。

其中,询问者提到已经有一个后台进程用于设置当前时间,因此可以在该进程中检查进程是否仍然存活,如果没有,则重新启动。这被认为是一个简单且良好的解决方法。

0