【问题标题】:C# how to load a form with marquee progress bar?C#如何加载带有选框进度条的表单?
【发布时间】:2010-12-21 13:09:07
【问题描述】:

我创建了一个loadingForm,它只有一个带有选取框样式的进度条。在我的 mainForm 中,我正在尝试这样做:

//before downloading
loadingForm lf = new loadingForm();
lf.Show();
//start downloading
//finishdownloading
lf.Close();

loadingForm 显示了,但是进度条没有出现,而且表单看起来像是崩溃了。下载完成后,loadingForm 关闭,我的应用继续正常运行。在 loadingForm 我只有:

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

我已经在 loadingForm.design 中将 progressbar1 样式设置为选取框。我该如何解决?提前感谢您的帮助。

【问题讨论】:

  • 在 lf.Show() 调用后 阻塞。使用 BackgroundWorker.RunWorkerCompleted 事件调用 lp.Close()
  • 抱歉,您能解释一下您的答案吗?我对编程有点陌生。你的意思是不要阻止?以及如何使用 BackgroundWoker.RunWorkerCompleted 来调用 lf.Close?谢谢。

标签: c# winforms progress-bar marquee


【解决方案1】:

您应该看看使用 BackgroundWorker Class 来处理耗时的操作,以便 UI 可以在后台工作线程执行工作时继续显示进度。

【讨论】:

  • 我可以在表单加载时使用后台 Worker 吗?因为在我的 mainForm 中,我已经将下载操作放在了其他线程中。 (我为从服务器到客户端的每次下载启动一个新线程,我的 mainForm 在客户端应用程序中)。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答。正如我在评论中问的那样,我可以在不同的线程上加载新表单吗?因为我的 mainForm 对于线程已经有点复杂了,因为客户端和服务器之间的每个连接都创建了新线程。
  • 是的,您可以在新线程上创建表单。您必须通过调用 Application.Run 或在另一个线程中使用 ShowDialog() 来确保消息循环正在运行。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多