【问题标题】:C# close other process when its not respondingC#在没有响应时关闭其他进程
【发布时间】:2018-02-26 19:01:13
【问题描述】:

我正在尝试编写一个程序,该程序将在另一个程序没有响应时重新启动它。当被监控的程序没有响应时,会弹出并显示系统消息框

 -> Check online for a solution or close the program
 -> Close the program
 -> Debug the program

一个windows事件将被写入windows事件日志。我向这个 Windows 事件添加了一个触发器,它将运行重新启动程序。它会杀死没有响应的程序,然后重新启动它。但是我发现 .kill() 和 .CloseMainWindow() 都不能关闭没有响应的程序和系统对话框。有没有办法杀死一个没有响应的程序? 以下是我的代码:

           Process[] processes = Process.GetProcessesByName(app_name);

            foreach (Process p in processes)
            {
                bool havingMainWindowHandle = false;
                if (p.MainWindowHandle == IntPtr.Zero) {
                    havingMainWindowHandle = false;
                    writeLog(p.ProcessName + " don't have MainWindowHandle");
                } else {
                    havingMainWindowHandle = true;
                    writeLog(p.ProcessName + " status:" + p.Responding.ToString());
                }

                p.WaitForExit(1000);
                if (havingMainWindowHandle)
                {
                    p.CloseMainWindow();
                    p.Close();
                } else
                {
                    writeLog(app_name + " is terminated by .kill() API");
                    p.Kill(); //but function kill() can't terminate the not responding program 
                }
                Thread.Sleep(1000);
            }

            Process my_otherprogram = new Process();
            my_otherprogram.StartInfo.FileName = app_path;       
            my_otherprogram.Start();

【问题讨论】:

  • “不响应”是什么意思?您是指Windows如何声明程序没有响应吗?如果是这样,你必须明白这一切意味着ui线程没有在设定的时间内将控制权返回给窗口。
  • 这里的“无响应”是指程序遇到问题,弹出系统对话框;用户只能在“在线检查解决方案或关闭程序”、“关闭程序”、“调试程序”之间进行选择。在这种情况下,我发现 .kill() 和 .CloseMainWindow() 都无法关闭“无响应”AP 并让系统对话框关闭。我正在寻找其他解决方案来关闭“无响应”(即将崩溃)AP。
  • 我发现即使是“taskkill /im myprocess.exe /f”也无法删除“没有响应”(即将崩溃)的AP。会出现错误:“访问被拒绝”。

标签: c#


【解决方案1】:

首先 - 了解“未响应”的含义。

这并不意味着您的应用程序已经崩溃。 这意味着运行应用程序的 UI 线程正忙。 这可能意味着该应用程序的开发人员选择将大量工作或非常长的循环放入 UI 线程,而不是在另一个线程上实现。

所有这些都将导致在工作负载期间“无响应”,直到 UI 线程被释放用于 UI 显示/渲染。

通常,您会得到 3 个选项:

-> 在线查看解决方案或关闭程序
-> 关闭程序
-> 调试程序

当 Windows 检测到您尝试与“无响应”应用程序交互时出现。 本质上,它会检测到您想要与 UI 交互,但 UI 目前不可用。 这并不意味着 UI 永远不会可用,也不意味着应用程序肯定已经崩溃。 这只是意味着 UI 在那个确切时刻无法接受请求。等待 10 秒或 10 分钟甚至可以让它自行修复。

现在,就您可能无法终止该进程的原因而言。 上面发布的评论表明您在尝试终止任务时会收到“拒绝访问”,这表明您希望终止的正在运行的进程可能正在以提升的权限运行。

根据经验,以管理员或本地服务身份运行的应用程序不能被具有较少权限的人或事物终止。

如果你想测试这个理论,以管理员身份运行你的命令提示符,看看任务 kill 是否给出相同的结果。

p.Kill();应该能够杀死所有进程,假设调用应用程序有足够的提升权限这样做。

但是应该注意,p.Kill 会以非常突然的方式终止应用程序,而不是让线程干净地终止 - 例如,数据库数据可能会处于中间状态,如果文件仍然打开则可能会损坏等.

如果您拥有正在经历“无响应”状态的应用程序并且您拥有该应用程序的源代码,理想的解决方案是将应用程序的繁重工作迁移到后台线程。

这可以很简单

Thread tworker = new Thread(()=>WorkThread(arg1,arg2,arg3));
tworker.IsBackground= true;
tworker.Start();

这会将您的 WorkThread 的执行转移到后台线程上,从而使您的 UI 线程干净整洁。 当然 - 您也可以将方法设计为异步并使用任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 2018-05-13
    • 2014-07-21
    • 2012-07-16
    相关资源
    最近更新 更多