表格在整个过程完成之前未显示

时间:2014-08-19 13:24:22

标签: c# multithreading winforms listbox progress-bar

我有一个Winform应用程序,它接收命令行参数并进行一些处理(创建文件,将数据插入数据库并将文件上传到FTP)。因此,为了查看流程,我有listbox向用户显示信息。还有一个进度条可以查看插入状态。

在我的form load事件中,我有一个RunCampaign()函数,它本身会按顺序调用其他函数,直到完成该过程。所有这些功能都会向listbox添加项目。

问题是:在整个过程完成之前,不会显示任何内容(甚至不是空表单)。当过程完成时,将显示包含信息列表框和进度条的整个表单。这不是我预期的行为。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您需要多线程化您的应用程序,以便您的UI线程可以自由显示表单:

private void Form1_Load(object sender, System.EventArgs e)
{
    Task t = new Task(() =>
    {
        //Logic

        //...

        //Update UI
        this.Invoke((MethodInvoker)delegate
        {
            listbox.Items.Add(...); // runs on UI thread
        });
    });
    t.Start();
}

如果您需要更多示例,请查看以下问题:How to update the GUI from another thread in C#?

答案 1 :(得分:0)

最好的方法是使用BackgroundWorker。 如果您不想使用任何多线程技术,请在 Form_Shown()事件中调用RunCampaign()函数。另外,调用Listbox.Update()&每当修改任何项目/值时,Progressbar.Update()。至少你会看到窗口,但是在控件来自Form_Shown()之前它不会响应。