2014-05-06 13 views
0

我看过的所有例子都显示了BackgroundWorker中的“长循环”。虽然我明白这是正确的做法,但我的问题是,代码最初不是这样写的,将它放入BackgroundWorker会很复杂。有没有什么办法可以在StatusBar或无模式弹出窗口中创建ProgressBar,而无需更改文件加载代码?谢谢。当文件加载代码不在BackgroundWorker中时,我可以显示进度指示器吗?

+3

该代码目前没有任何类型的线程?无论哪种方式,你可以“创建一个进度条”..但如果它目前不在一个线程中,你的文件加载代码无疑会阻止UI线程..因此,进度条的任何更新将无法看到。 –

+0

在WPF/Silverlight/Metro中,您可以使用数据绑定。如果文件正在后台线程中加载,并且您的公共属性包含已加载的文件的百分比,则可以将此属性绑定到进度条的值,并且在更新属性时它将被更新。一个更简单的解决方案,但可能不会那么好:您还可以在加载文件时将进度条设置为不确定状态(它显示它正在加载文件,但没有完成/剩余多少)。 – Bedford

+0

不,你不能在不同于UI线程的线程上运行加载代码。 BackgroundWorker本身并不是必需的,但它是一个不同的选项。 – BradleyDotNET

回答

0

只有这样,你才能真正做到这一点,如果你的长期运行的代码可以分割成多个部分在这种情况下,你可以做这样的事情:

//long running code 
DoSomethingStage1(); 

progressBar.Value = 30; 
Application.DoEvents(); // update the GUI 

DoSomethingStage2(); 

progressBar.Value = 60; 
Application.DoEvents(); // update the GUI 

DoSomethingStage3(); 

progressBar.Value = 100; 
Application.DoEvents(); // update the GUI 

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents(v=vs.110).aspx

这是一个尽管如此,如果可以的话,最好咬住子弹并将代码移出到单独的线程。

相关问题