检测应用程序何时停止响应,杀死并重新启动它

Meh*_*ANI 7 c# windows

我正在开发一个高性能应用程序,导致主进程看似停止响应和崩溃 - 不时 - 由于过载(我得到关闭应用程序对话框,所以应用程序永远不会退出本身,只是冻结,这很烦人)

我欢迎任何干净的方式来临时检测应用程序冻结,所以我可以使用BAT(或其他)自动杀死进程和重新启动.

当然,这是审核App时的临时修复,但同时也非常方便.

TieBreaker: BTW,有没有办法覆盖Windows的异常屏幕,只是退出应用程序??? 这大部分时间都是烦人的功能.

编辑:
在上帝的份:应用IS再用冷冻,虽然每一个任务BG工人线程运行!我在评论中指明了这一点.来吧,我不是那么傻.只是你的应用程序运行BG工作人员并不意味着它永远不会冻结!正如我所说,请务必回答我的问题,我不是在寻找有关如何设计我的应用程序的课程,我已经在努力了,我知道必须做些什么.正如多次指定的那样,我在此期间只需要修复服务器.谢谢.

Ale*_*lex 11

我会说,如果没有其他人会:)制作一个单独的表格应用程序,它 -

Process[] prs = Process.GetProcesses();

foreach (Process pr in prs)
{
    if (!pr.Responding) 
    {
        try
        {
            pr.Kill();
        }
        catch { }
    }
}

//then to restart-
var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = @"C:\yourapp.exe"
    }
};
process.Start();
Run Code Online (Sandbox Code Playgroud)

显然过于简单了.


Ωme*_*Man 1

将所有 CPU 密集型任务移出 GUI 并调用回 GUI 以报告任何状态。

主应用程序永远不应该冻结。我编写了一个应用程序,它生成了 500 多个线程(同时),并在它们异步 (.net 2) 处理多个数据库调用时对其进行管理。我相信您需要系统地将所有进程转移到线程安全的情况并删除任何直接的 GUI 调用。

附录 我如何运行 500 多个线程:

  1. 从一开始就在所有共享数据位置使用智能锁。请参阅我的博客文章

    C# .Net 中的智能资源锁定以实现线程安全代码
    C# 多线程使用线程池、匿名委托和锁

  2. 创建的接口指定了一个带有数据、错误状态作为属性的动作操作。
  3. 创建线程基类(针对 #4 和 #5 中的类),用于创建、启动和清理线程操作。没有业务逻辑,只是一种在一个位置处理线程的方法。
  4. 基于 #2 中的接口创建的类,也是从步骤 #3 派生的。需要通过接口的类来获取数据和放置数据(通过本地锁实现线程安全)并报告其状态。该类还设计为,如果没有通过 thread.Sleep(0) 完成任何工作,则放弃线程周期,而不是忙于等待。
  5. 创建了 Manager 类(它在自己的线程上运行并从 #3 派生)。它启动了 1-N 个 #4 类来完成工作。每个实例都被放入工作列表中。
  6. 管理器类只是浏览工作列表以查找报告其工作已完成的实例(如果已完成),则将实例移动到已完成的工作。管理器类还保留公开属性的状态记录(通过锁实现线程安全)(以及子实例报告的任何错误)。Manager 在每次运行后放弃线程周期,并在重新开始之前休眠 250 毫秒。
  7. GUI 线程有工作计时器,用于从管理器获取特定状态。他们将从管理器的属性中提取数据,并调用 GUI 来定位报告所有状态和错误的控件(gridview)。

通过这样做,我能够实现执行特定工作的单独线程,并且如果进程遇到问题,它会报告该问题,或者报告成功或失败。这些消息向上传送到管理器,再向上传送到计时器,再向上传送到 GUI。除了启动管理器和计时器之外,GUI 不处理任何业务逻辑。


我知道这对你现在的情况没有帮助,我能感受到你的痛苦。但是,直到您能够将业务逻辑从 GUI 中分离出来并处理线程(后台工作人员)中的错误情况并将它们冒泡到 GUI 之前,您仍然会对当前代码感到沮丧。

如果某些东西被锁定,则表明业务逻辑与 GUI 操作耦合得太紧密,必须先将其分离,然后才能从 GUI 获得所需的性能。

华泰