我有一个我正在编写的 C# 软件,每次它执行一项艰巨的任务时,我都会切换窗口以让它完成窗口搞砸。不知道该怎么说,但所有的按钮都消失了或变成了“洞”。我知道应用程序正在运行,因为进度条会在一段时间后再次出现。我该如何解决?我一直在寻找,我确信它与双缓冲有关。
我有一个我正在编写的 C# 软件,每次它执行一项艰巨的任务时,我都会切换窗口以让它完成窗口搞砸。不知道该怎么说,但所有的按钮都消失了或变成了“洞”。我知道应用程序正在运行,因为进度条会在一段时间后再次出现。我该如何解决?我一直在寻找,我确信它与双缓冲有关。
您通常通过在与主 UI 线程分开的线程中执行资源密集型进程来解决此问题,这样 UI 线程可以根据需要刷新 UI,并且您的持久操作可以并行完成。在后台/工作线程完成其任务后,控制流将返回给应用程序。
当您想从工作线程更新 UI 线程中的状态栏时,事情会稍微复杂一些,通常您必须使用 Invoke 方法,因为您绝对不应该尝试从另一个线程访问和修改 UI 控件。
一种更便宜的方法,哪种方法可行但有时会出现一些问题,是在您的持久操作中不时包含一个调用Application.DoEvents()
,例如,如果您处于循环中,则循环的每几次迭代(取决于执行一次迭代需要多少时间以及总共有多少次迭代);此方法有效,并且可以完全避免您从开始使用多个线程开始,但也被认为不太可靠。
正如 LarsTech 已经指出的那样,请使用 -Class BackgroundWorker
,尤其是对于耗时超过几秒钟的任务。
确保ReportProgress
在您的 Backgroundworker 中使用来通知您的 Progressbar。
值得研究的好链接: