我有一个Winform
应用程序,它接收命令行参数并进行一些处理(创建文件,将数据插入数据库并将文件上传到FTP)。因此,为了查看流程,我有listbox
向用户显示信息。还有一个进度条可以查看插入状态。
在我的form load
事件中,我有一个RunCampaign()
函数,它本身会按顺序调用其他函数,直到完成该过程。所有这些功能都会向listbox
添加项目。
问题是:在整个过程完成之前,不会显示任何内容(甚至不是空表单)。当过程完成时,将显示包含信息列表框和进度条的整个表单。这不是我预期的行为。
我该如何解决这个问题?
答案 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()之前它不会响应。