Winforms 检测到自己的应用程序中没有响应

Winforms 检测到自己的应用程序中没有响应,winforms,Winforms,是否有可能检测到应用程序何时停止响应,以便自动采取适当的操作,而不是用户必须转到任务管理器/结束进程和/或结束任务等?您所能做的最多就是记录一个操作所需的时间,如果它花费的时间太长,则直接终止它。当然,操作中必须有一个类似于CancelEventArgs的东西,您的主应用程序可以订阅和调用它 另一种方法是在一个单独的线程中启动操作,在主线程中,记录该线程运行的时间,如果运行的时间过长,则终止该线程。您最多可以记录一个操作运行的时间,如果运行的时间过长,则终止该操作。当然,操作中必须有一个类似于C

是否有可能检测到应用程序何时停止响应,以便自动采取适当的操作,而不是用户必须转到任务管理器/结束进程和/或结束任务等?

您所能做的最多就是记录一个操作所需的时间,如果它花费的时间太长,则直接终止它。当然,操作中必须有一个类似于
CancelEventArgs
的东西,您的主应用程序可以订阅和调用它


另一种方法是在一个单独的线程中启动操作,在主线程中,记录该线程运行的时间,如果运行的时间过长,则终止该线程。

您最多可以记录一个操作运行的时间,如果运行的时间过长,则终止该操作。当然,操作中必须有一个类似于
CancelEventArgs
的东西,您的主应用程序可以订阅和调用它


另一种方法是在一个单独的线程中启动操作,在主线程中,记录该线程运行的时间,如果时间过长,则终止该线程。

您应该尝试使应用程序不停止响应


一种方法是在不同的线程中启动这些复杂的任务,并在超时后杀死它们。

您应该尝试使应用程序不停止响应


一种方法是在不同的线程中启动这些复杂的任务,在超时后杀死它们。

我会这样做:让一个计时器在主线程中定期启动,将计数器重置为0。然后,在另一个线程中,使用另一个计时器递增计数器。当计数器达到某个值时,表示主线程已停止响应一段时间。

我会这样做:在主线程中定期启动计时器,将计数器重置为0。然后,在另一个线程中,使用另一个计时器递增计数器。当计数器达到某个值时,表示主线程已停止响应一段时间。

请接受我的意见-这不是对您问题的直接回答,而是一些避免陷入您的情况的设计建议。如果你的应用程序真的被锁定并且没有响应,那么就真的没有办法检测到它并做出响应。诀窍是避免一开始就陷入这种情况

根据我的经验,WinForms应用程序几乎从不停止响应。相反,在执行长时间运行的任务或陷入无限(或至少长时间运行的)循环时,它们往往显得没有响应

您可以通过使用多线程技术将长时间运行的进程放在另一个线程中来避免这种情况。对于长时间运行的循环,一个更简单的技巧是放置代码

Application.DoEvents()

在循环内部。这将允许应用程序在循环运行时显示为响应,而在正常情况下,应用程序将显示为锁定

我通常处理这一问题的方式是,我会不断更新状态标签,让用户知道应用程序正在执行如下所示的操作:

foreach(DataRow r in myTable.Rows)
{
   StatusLabel.Text = "Now processing " + r[0].ToString();
   Application.DoEvents();
   ... now do the real work
}
这会给用户反馈,让他们知道应用程序实际上在做什么,而不仅仅是“锁定”。99%的时候,用户的感知才是最重要的

编辑-添加以回答以下评论

Application.DoEvents()是否包含性能命中。你需要决定是否值得。正如我上面所示(与某种进度指示器结合使用),它可以消除用户的挫折感,我发现对于长时间运行的流程来说,这是一个值得权衡的选择

我最初的回答提到,99%的时间里,感知是最重要的。我将举一个例子,说明我在哪里使用它,并认为它是合理的

我继承了我的一位前任编写的WinForms应用程序。该应用程序有一个每周需要完成的流程,用于汇总和处理数百万条记录。除大量记录外,数据库设计不当,因此整个过程耗时一个多小时。因此,用户会被困在电脑前一个小时,看这个屏幕什么也不做。他们无法知道这个应用程序是否真的在工作。我添加了上面的代码作为临时措施,最终用户非常感激。他真的很感激知道应用程序真的在工作,而不是挂断

添加application.DoEvents()将处理时间从一小时增加到一小时五分钟左右。这是一个明显的慢下来,但用户更高兴,因为即使它需要更长的时间,他知道它在做什么

顺便说一句,这也让我更开心,因为偶尔,当由于记录计数异常高而花费更长时间时,用户会结束程序上的任务并重新运行它,认为它已被锁定,这将不可避免地导致我不得不花费数小时来修复数据


最后,我从头开始重新编写应用程序,包括重新设计数据库,同样的过程现在需要5秒钟。我添加这些并不是为了吹嘘,而是为了让你思考为什么你的应用程序似乎被锁定了。如果你能以一种更有效的方式完成任务并获得更好的设计,你可以在很多情况下完全避免这种情况。

请接受我的意见-这不是对你问题的直接回答,而是一些避免陷入你的处境的设计建议。如果你的应用程序真的被锁定并且没有响应,那么就真的没有办法检测到它并做出响应。诀窍是避免一开始就陷入这种情况

根据我的经验,WinForms应用程序几乎从不停止响应。相反,在执行长时间运行的任务或陷入无限(或至少长时间运行的)循环时,它们往往显得没有响应

您可以通过将长时间运行的进程放在另一个t中来避免这种情况