当您使用进度条时,它是否在 UI 线程中运行?我问是因为我想知道如何为在 UI 线程上运行的冗长任务显示进度条。
我有一些窗口需要一段时间才能打开并完全呈现,我想向用户表明正在发生的事情。他们中的一些人不耐烦,如果用户界面在 1/4 秒内没有响应,他们就会开始疯狂地点击。
IE 冗长的过程不一定是我想在后台线程中运行的东西。那么在这种情况下如何显示进度条呢?
当您使用进度条时,它是否在 UI 线程中运行?我问是因为我想知道如何为在 UI 线程上运行的冗长任务显示进度条。
我有一些窗口需要一段时间才能打开并完全呈现,我想向用户表明正在发生的事情。他们中的一些人不耐烦,如果用户界面在 1/4 秒内没有响应,他们就会开始疯狂地点击。
IE 冗长的过程不一定是我想在后台线程中运行的东西。那么在这种情况下如何显示进度条呢?
如果是长时间运行的操作,则属于后台线程。但是,如果它是一个主要操作是与 UI 元素交互的操作,您可能会遇到一点延迟。
但请注意,将进程与 UI ( MVC ) 分开是可行且可取的,因此它可以在后台线程上运行,因此无论如何这样做对于应用程序的设计都是有益的。
您可以Application.DoEvents()
在 GUI 线程中使用以允许更新进度条,但是由于重新输入问题和性能,不鼓励这样做。
您最好的选择确实是后台线程。这在带有类
的 .NET 框架中变得特别容易。后台工作人员的 Msdn 帮助System.Threading.BackgroundWorker
您可以在 UI 线程上运行冗长的任务,同时显示进度条。
但是,您将丢失进度条上的 Win7/Vista 动画,并且如果您在 5 秒内未运行消息循环,Windows 会将您的应用程序标记为“无响应”。
既可以从BackgroundWorker
(它有特殊事件)更新进度条,也可以从 UI 线程上运行的函数更新进度条。在后一种情况下,我传入一个可以调用以更新进度条的委托。
另一件事:如果您在 UI 线程上运行,则无法轻松实现取消按钮,因为您的消息泵被阻塞。
因此BackgroundWorker
,对于较长的任务,我建议使用初始屏幕,如 Gabe 在他的评论中建议的那样。