C#如何使用跑马灯进度条加载窗体?

3
我创建了一个只有进度条的加载窗体,采用跑马灯样式。在我的主窗体中,我正在试图做到这一点:
//before downloading
loadingForm lf = new loadingForm();
lf.Show();
//start downloading
//finishdownloading
lf.Close();

加载界面出现了,但进度条没有出现,界面看起来像是崩溃了。下载完成后,加载界面关闭,我的应用程序继续正常运行。在加载界面上,我只有:

void loadingForm_Load(object sender, EventArgs e)
{
     progressbar1.visible = true;
}

我已经在loadingForm.design中将progressbar1的样式设置为marquee。我该如何解决这个问题?提前感谢您的帮助。

1
在 lf.Show() 调用后不要阻塞。使用 BackgroundWorker.RunWorkerCompleted 事件来调用 lp.Close()。 - Hans Passant
抱歉,你能解释一下你的答案吗?我对编程还比较新。你所说的不要阻塞是什么意思?我该如何使用BackgroundWorker.RunWorkerCompleted来调用lf.Close?谢谢。 - PeteMerry
3个回答

3

我能在窗体加载时使用后台工作器吗?因为我已经将下载操作放在其他线程中的主窗体中。(我为从服务器到客户端的每个下载启动一个新线程,我的主窗体位于客户端应用程序中。) - PeteMerry

1

这很可能是因为下载和带有进度条的表单在同一个线程上运行。您可以使用BackgroundWorker在与表单不同的线程中执行下载。


谢谢你的回答。正如我在评论中问过的那样,我能否在不同的线程上加载新表单?因为我的主窗体已经涉及到了线程,每个客户端和服务器之间的连接都需要创建一个新线程。 - PeteMerry
是的,您可以在新线程上创建一个表单。您必须确保有一个消息循环正在运行,方法是调用Application.Run或在其他线程中使用ShowDialog()。 - shf301

0
UI线程可能没有“资源”来重新绘制UI,您应该像提到的那样使用后台工作程序,或者处理队列中的应用程序消息。从Show()方法到Close()方法,您应该确保调用Application.DoEvents(),以便所有窗口消息都将被处理(以及重绘消息到您的应用程序表单)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接