代码之家  ›  专栏  ›  技术社区  ›  jay_t55

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

  •  0
  • jay_t55  · 技术社区  · 16 年前

    4 回复  |  直到 16 年前
        1
  •  2
  •   David Espart    16 年前

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

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

        2
  •  2
  •   David    16 年前

    根据我的经验,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()将处理时间从一小时增加到一小时五分钟左右。这是一个明显的慢下来,但用户更高兴,因为即使它需要更长的时间,他知道它在做什么。

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

        3
  •  1
  •   Graviton    16 年前

    CancelEventArgs 在其中,您的主应用程序可以订阅和调用。

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

        4
  •  0
  •   Thomas    16 年前

    推荐文章