2010-07-07 39 views
3

我的软件需要存储某些特定位置的目录和注册表结构。这通常需要很长时间。假设我有一个名为SaveState()的方法。C#:在漫长的过程中显示模态进度对话框

我想将其包装到另一种方法SaveStateWithProgress()中,这样当我调用它时,会出现一个模式对话框,其中显示一个简单的进度条并具有取消操作的按钮。我看到它的方式,我可能需要使用两个线程,虽然在VB6或Java中,我曾经用Thread.Yield()命令相当于 - 不知道这是否是最佳做法,即使在C#中有类似的东西。什么是最好的方式去做呢?

回答

4

这是site,我认为它可以满足你的需求。

它有使用进度条和后台工作器(使用BackgroundWorker.RunWorkerAsync())的示例。

+0

我在Scott Chamberlain的答案中选择了这个教程,而不是这个,因为这个站点没有提到BackgroundWorker类的'WorkerReportsProgress'属性,这是绝对关键的,必须设置为True才能使进度报告生效。 – 2013-10-03 18:34:39

+2

不是在模态窗口中显示程序栏的问题吗? – 2014-04-02 09:20:31

-1

在C#中,您可以拨打Thread.Sleep(0)Thread.Sleep(1)来完成与Java的Thread.Yield()相同的操作。

就这样说,你肯定需要在一个单独的线程中做你的SaveState()。在你的SaveState()函数中有一个变量,当SaveState()进展时更新。在你的模态进度表中放置一个计时器控件,并让计时器检查SaveState()正在更新的变量。适当地更新你的进度条

+2

确实'Thread.Sleep(0)'会产生当前线程,但是如果你的UI在同一个线程上运行,你就不好。 .NET框架确实具有'Application.DoEvents()'实质上可以产生消息泵循环的一次传递,但是使用'BackgroundWorker'是很好的选择。 – 2010-07-07 16:01:34

-1
ProgressBar p = new ProgressBar(); 
p.Location = new Point(10, 10); 
p.Size = new Size(100, 30); 
p.MarqueeAnimationSpeed = 30; 
p.Style = ProgressBarStyle.Marquee;