我正在编写一个可能需要花费很多时间才能加载的程序(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();
}
但我一直在NullReferenceException
backgroundWorker1.RunWorkerAsync();
答案 0 :(得分:1)
一个鲜为人知或经常被遗忘的框架库是Microsoft.VisualBasic。您可以将它与C#应用程序一起使用。只需添加一个Reference ...和这个类。它处理所有后台工作者线程和其余部分。
public class MyApplication : WindowsFormsApplicationBase
{
private static MyApplication _application;
public static void Run(Form form)
{
_application = new MyApplication{ MainForm = form };
_application.Run(Environment.GetCommandLineArgs());
}
protected override void OnCreateSplashScreen()
{
this.SplashScreen = new MySplashScreenForm();
}
}
最后,从:
更改Program.Main()下的应用启动Application.Run(new Form1());
到
MyApplication.Run(new Form1());
如果您不熟悉,此课程还提供了更多功能,如单实例处理,绝对值得一看。
答案 1 :(得分:0)
也许这会有所帮助:
添加:
Shown += new EventHandler(Form1_Shown);
在InitializeComponent();
之后。
并添加:
void Form1_Shown(object sender, EventArgs e)
{
Refresh();
}
此外,如果您未在Designer中订阅BackgroundWorker1DoWork
事件处理程序,则必须添加:
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
答案 2 :(得分:0)
我最终做的可能并不优雅,但它完成了我所需要的。
public FrmMain()
{
InitializeComponent();
backgroundWorker1.RunWorkerAsync();
var loading = new FrmLoading();
loading.ShowDialog();
}
private void BackgroundWorker1DoWork(object sender, DoWorkEventArgs e)
{
DbQuery();
}
private void BackgroundWorker1RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Loading.Close();
}
这会调出我的loading
表单,使其具有焦点并完全加载。由于我在调用DoWork
之前调用了ShowDialog()
,因此BackgroundWorker
继续有效。完成DbQuery()
后,会调用BackgroundWorker1RunWorkerCompleted()
,关闭FrmLoading
并继续使用我的程序。感谢所有发布的人。