0

我正在编写一个可能需要相当长的加载时间(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();
}

但我一直NullReferenceExceptionbackgroundWorker1.RunWorkerAsync();

4

3 回答 3

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());

如果你不熟悉,这个类还提供了更多的特性,比如单实例处理,绝对值得一看。

于 2012-11-08T18:21:44.333 回答
0

也许这会有所帮助:

添加一个:

Shown += new EventHandler(Form1_Shown);

在你的InitializeComponent();.

并添加:

void Form1_Shown(object sender, EventArgs e)
{
    Refresh();
}

此外,如果您没有订阅BackgroundWorker1DoWorkDesigner 中的事件处理程序,则必须添加:

backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
于 2012-11-08T20:28:27.053 回答
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并继续执行我的程序。感谢所有发帖的人。

于 2012-11-08T22:03:54.037 回答