2011-05-19 17 views
1

当您使用进度条时,它是否在UI线程中运行?我问,因为我想知道如何在UI线程上运行的冗长任务显示进度条。在Windows窗体中使用进度条时,“冗长进程”是否必须在非UI线程上运行?

我有一些窗户,需要一段时间才能敞开心扉,完全呈现,我会喜欢的东西,以指示某些事情正在发生的用户。他们中的一些人不耐烦,如果UI在1/4秒内无响应,他们就会像疯了一样点击。

I.E.漫长的过程不一定是我想在后台线程中运行的东西。那么如何在这种情况下显示进度条?

+0

启动画面是否工作? – Gabe 2011-05-19 18:13:47

+0

@加贝:不知道你的意思。这不仅仅是当他们打开应用程序时。我希望在屏幕上放置很多屏幕。像一个简单的选框。 – richard 2011-05-19 18:16:51

回答

2

你可以使用Application.DoEvents()在GUI线程,让进度条进行更新,但是这是气馁由于再入问题和性能。
你最好的选择确实是一个后台线程。
这使得在.NET框架中使用System.Threading.BackgroundWorker类特别容易。 Msdn help on backgroundworkers

+0

运行冗长任务的后台线程?所以你说我需要花费很长的时间并在后台线程中运行它? – richard 2011-05-19 18:18:44

+0

这将是理想的解决方案。但是我明白你的不情愿是由于使用线程时产生的额外问题。 :) – Mr47 2011-05-19 18:19:46

+0

这和事实,我需要重新做一堆屏幕,所以他们在后台运行他们的进程。 。 。 – richard 2011-05-19 18:21:07

2

如果它是一个长期运行的操作,它属于在后台线程。但是,如果它的主要操作是与UI元素进行交互的操作,则可能会延迟一段时间。

但是,请注意,从UI分离进程(MVC)可能是可行的,因为它可以在后台线程上运行,所以无论如何,这对于应用程序的设计都是健康的。

+0

谢谢。这说得通。该过程主要涉及与UI的交互,所以我只想要一个“保持你的马匹”指标。 – richard 2011-05-19 18:29:23

+0

在这种情况下,您将无法使用进度栏,因为您无法更新它。即使您以编程方式更改其进度,除非您的方法完成,否则这不会影响用户界面。您可以添加某种“请稍等”的标签,但这意味着要找到一种方法让UI呈现在代码中间运行的机会。也许Invalidate方法? http://msdn.microsoft.com/en-us/library/598t492a.aspx重绘可能不会发生,直到你的方法完成,但。 – 2011-05-19 22:43:35

+0

我明白了。即使显示动画GIF也没问题。我可以这样做吗? – richard 2011-05-19 23:26:33

0

您可以运行在UI线程上的冗长的任务,并显示在同一时间的进度条。

但是,您将失去进度条上的Win7/Vista动画,并且如果您不运行五秒钟的消息循环,Windows会将您的应用标记为“无响应”。

可以从BackgroundWorker(它有它的特殊事件)以及在UI线程上运行的函数更新进度条。在后一种情况下,我传入一个可以调用的委托来更新进度栏。其他

一两件事:如果你在UI线程上运行,则无法实现一个取消按钮,可以轻松地,因为你的消息泵被阻止。

所以我建议一个BackgroundWorker更长的任务,对于短期任务加布在他的评论中提出了一个闪屏可能会做。

+0

我如何在UI线程中执行冗长的任务的同时运行进度条或选取框? – richard 2011-05-19 18:30:37

+0

您可以在不阻止UI线程的情况下打开窗口。有关更多详细信息,请从我对这里相关问题的回答开始:http://stackoverflow.com/questions/5398084/how-to-implement-progress-using-ienumerable/5398198#5398198 – 2011-05-19 18:35:32

相关问题