【问题标题】:Right way to run, kill and keep process running运行、终止和保持进程运行的正确方法
【发布时间】:2014-05-22 14:32:32
【问题描述】:

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

  • 在 mainApplication 启动时打开进程
  • mainApplication 关闭或更改有关打印机的任何信息时关闭进程
  • 如果出现任何错误,请保持进程处于活动状态

第一点很简单,我只是简单

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 上编写的。也许有任何方法可以处理 ANY WinForm 应用程序退出事件(嗯,任何,但不是这个,它只是简单地从另一个应用程序中关闭它),然后重新打开它?

【问题讨论】:

  • 为什么你的进程一开始就死掉了?如果您遇到错误并且它正在杀死您的进程,那么您需要考虑错误处理。
  • 您为什么没有一个应用程序?可以将托盘功能添加到 WPF 应用程序。我使用了此线程中引用的 NotifyIcon stackoverflow.com/questions/1472633/…
  • @kenny - 原因是,我在 WPF 中使用的 DLL 不起作用。打印收据后,出现堆栈溢出错误。工作是空的,我的项目。在 WinForms 中一切正常。
  • @IanO'Brien - 在我的应用程序 (wpf) 中,我有方法来捕获未处理的异常。这使应用程序保持打开状态(我的意思是我有带有错误消息的窗口和允许用户向我发送日志的按钮)。但不确定WinForms中是否有类似的东西。编辑:在 WPF 中我使用 Current.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(Current_DispatcherUnhandledException);
  • 好吧,也许这会有所帮助:System.Windows.Forms.Application.ThreadException

标签: c# wpf winforms process


【解决方案1】:

proc.Close() 要求它关闭,但不能保证。使用:

proc.Kill();

【讨论】:

  • 我不太明白你说的第三部分是什么意思。如果 WPF 应用程序中发生错误,您是否尝试让基于托盘的进程保持活动状态?
  • 不。我想做类似的事情:如果托盘(winforms)应用程序出现任何错误,请关闭并重新打开它。但是当主 (wpf) 应用程序关闭时,必须关闭 winforms 应用程序 - 在这种情况下不要重新打开 winforms 应用程序。
  • 添加一个后台进程,每隔几秒检查一次托盘应用程序是否正在运行。设置托盘应用程序,使其在出错时终止。然后在 WPF 应用程序中,如果它注意到托盘应用程序没有运行,则只需重新启动它。
  • 嗯,我有后台进程来设置当前时间,所以我可以检查有没有进程仍然活着,如果没有,重新启动。简单而好的恕我直言回复。
【解决方案2】:

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

process.Close() 未关闭应用程序的原因是应用程序未处理窗口消息(因为此调用模拟 WM_CLOSE 请求,根据经典 Windows API。)

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

此外,您可以使用“关键终结器”,它可以保证在应用程序退出之前运行,除非在完全灾难场景中。

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多