【问题标题】:How to prevent a Not Responding message on a window's title bar?如何防止窗口标题栏上出现 Not Responding 消息?
【发布时间】:2012-06-14 02:17:15
【问题描述】:

我使用 VS2010 和 C# 来构建一个桌面应用程序。此应用程序有一个表格,任务繁重,需要花费大量时间才能完成。初始化此表单后,它可以正常工作,只是它在标题栏上显示 “Not Responding”,如图所示:

完成所有任务后,它会显示所需的输出。为什么会显示此消息,如何防止?

【问题讨论】:

  • 我投了赞成票,因为对于没有太多经验的人来说,这是一个合理的问题。

标签: c# winforms response


【解决方案1】:

您需要使用 BackgroundWorker 以便耗时的任务将在单独的线程中异步运行。这将允许 Windows 多任务处理使 UI 响应。您应该使用等待光标或其他视觉指示器来让用户知道您的应用程序正忙。

来自 MSDN MSDN BackgroundWorker

BackgroundWorker 类允许您在单独的专用线程上运行操作。下载和数据库事务等耗时的操作可能会导致您的用户界面 (UI) 在运行时似乎停止响应。当您需要响应式 UI 并且面临与此类操作相关的长时间延迟时,BackgroundWorker 类提供了一种方便的解决方案。

要在后台执行耗时的操作,请创建一个 BackgroundWorker 并侦听报告操作进度并在操作完成时发出信号的事件。您可以通过编程方式创建 BackgroundWorker,也可以从工具箱的“组件”选项卡将其拖到表单上。如果在 Windows 窗体设计器中创建 BackgroundWorker,它将出现在组件托盘中,其属性将显示在属性窗口中。

要设置后台操作,请为 DoWork 事件添加事件处理程序。在此事件处理程序中调用您的耗时操作。要开始操作,请调用 RunWorkerAsync。要接收进度更新通知,请处理 ProgressChanged 事件。要在操作完成时收到通知,请处理 RunWorkerCompleted 事件。

【讨论】:

    【解决方案2】:

    您需要在后台线程上运行大型任务,以免锁定 UI(主)线程。

    【讨论】:

    • BlackSpy 感谢回复,不明白“锁定UI(主)线程”这句话,请您详细说一下。
    • 我建议对 Backgroundworker 类进行一些研究并在其中运行您的进程。这将防止 UI 在等待您长时间运行的操作完成时冻结。这是由于“工作”在与 UI 不同的线程上运行,因此 UI 事件(绘制、刷新等)不会被阻止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多