|
1
2
您应该尝试使您的应用程序不停止响应。 一种方法是在不同的线程中启动这些复杂任务,并在超时后杀死它们。 |
|
2
2
根据我的经验,WinForms应用程序几乎从不停止响应。相反,在执行长时间运行的任务或陷入无限(或至少长时间运行的)循环时,它们往往显得没有响应。
在循环内部。这将允许应用程序在循环运行时显示为响应,而在正常情况下,应用程序将显示为锁定。 我通常处理这一问题的方式是,我会不断更新状态标签,让用户知道应用程序正在执行如下所示的操作:
这会给用户反馈,让他们知道应用程序实际上在做什么,而不仅仅是“锁定”。99%的时候,用户的感知才是最重要的。 编辑-添加以回答下面的评论 Application.DoEvents() 做 包括表演热播。你需要决定是否值得。正如我上面所示(与某种进度指示器结合使用),它可以消除用户的挫折感,我发现对于长时间运行的流程来说,这是一个值得权衡的选择。 我最初的回答提到,99%的时间里,感知是最重要的。我将举一个例子,说明我在哪里使用它,并认为它是合理的。 我继承了我的一位前任编写的WinForms应用程序。该应用程序有一个每周需要完成的流程,用于汇总和处理数百万条记录。除大量记录外,数据库设计不当,因此整个过程耗时一个多小时。因此,用户会被困在电脑前一个小时,看这个屏幕什么也不做。他们无法知道这个应用程序是否真的在工作。我添加了上面的代码作为临时措施,最终用户非常感激。他真的很感激知道应用程序真的在工作,而不是挂断。 添加application.DoEvents()将处理时间从一小时增加到一小时五分钟左右。这是一个明显的慢下来,但用户更高兴,因为即使它需要更长的时间,他知道它在做什么。 顺便说一句,这也让我更开心,因为偶尔,当由于记录计数异常高而花费更长时间时,用户会结束程序上的任务并重新运行它,认为它已被锁定,这将不可避免地导致我不得不花费数小时来修复数据。
|
|
|
3
1
另一种方法是在一个单独的线程中启动该操作,在主线程中,记录该线程运行的时间,如果运行的时间过长,则终止该线程。 |
|
|
4
0
|