进度条形式未完全加载

时间:2012-11-08 17:01:51

标签: c# winforms progress-bar

我正在编写一个可能需要花费很多时间才能加载的程序(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();

3 个答案:

答案 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并继续使用我的程序。感谢所有发布的人。