【发布时间】:2012-11-08 17:01:50
【问题描述】:
我正在编写一个加载时间较长的程序(5-30 秒)。我想要一个以选取框样式进度条开头的表单,以便用户知道正在做某事。
public FrmMain()
{
var loading = new FrmLoading();
loading.Show();
InitializeComponent();
// other start up code here
loading.Close()
}
现在,loading 弹出来就好了。问题是标签和进度条什么都没有显示,看起来就像是崩溃了。我已经查看了BackgroundWorker,但老实说,我并不完全理解如何让它为我工作。我尝试按照以下教程和示例进行操作:
但我的脑袋就是不明白。有没有其他方法可以让表单正确加载?感谢您的所有帮助。
编辑
我的BackgroundWorker 尝试包括我创建一个函数来执行我在FrmMain 中完成的所有操作。所以,我有:
public FrmMain()
{
Loading = new FrmLoading();
Loading.Show();
backgroundWorker1.RunWorkerAsync();
}
private void FormLoading()
{
// Initialize and loading elements of the form
InitializeComponent();
}
private void BackgroundWorker1DoWork(object sender, DoWorkEventArgs e)
{
FormLoading();
}
private void BackgroundWorker1RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Loading.Close();
}
但我在backgroundWorker1.RunWorkerAsync(); 上不断收到NullReferenceException
【问题讨论】:
-
这正是使用后台工作人员的情况。请说明您使用它的尝试,并说明您在使用该解决方案时遇到的问题。一般的方法很简单。构造函数显示加载表单,启动后台工作者,
DoWork事件执行长时间运行的任务,完成事件关闭加载表单。技术上还有其他方法,例如使用任务、异步/等待、直接线程访问等,但如果您在使用 BGW 时遇到问题,使用这些方法会更难,而不是更容易。 -
问题是您正在主 (UI) 线程中进行所有处理。当你这样做时,线程没有机会绘制控件,并且 Windows 认为你的应用程序被卡住了。正如@Servy 刚刚写的那样,您应该在后台线程中进行处理(
BackgroundWorker适合这种情况),然后在完成后返回主线程。 -
编辑显示
BackgroundWorker的尝试。 -
FrmMain() 构造函数丢失了 InitializeComponent() 调用。是的,那会爆炸。
标签: c# winforms progress-bar