【问题标题】:Progressbar with a timer带计时器的进度条
【发布时间】:2013-03-12 09:30:09
【问题描述】:

我有一段代码将可用的服务器实例从我的 SQL 服务器获取到 DataTable。填充需要一些时间。所以我尝试添加一个进度条来指示那个时间。有一些方法可以做到这一点:

1.使用后台工作者
2.使用计时器

我使用了计时器,但进度条没有动画。

我的代码是(WinForm):

private void frmCodeGenerator_Load(object sender, EventArgs e)
    {
        Cursor.Current = Cursors.WaitCursor;
        tmrWaiting.Enabled = true;
        tmrWaiting.Start();

        //List all available servers
        PopulateServerInstances();
        //List all default namespaces to import

        //Set the target folder default path tec.

        tmrWaiting.Stop();
        Cursor.Current = Cursors.Default;
    }

private void tmrWaiting_Tick(object sender, EventArgs e)
        {            
            pbWaiting.Value++;
        }

光标从正常状态变为等待状态,但进度条没有。我做错了吗?

【问题讨论】:

  • 你设置pbWaiting.Maximum了吗?
  • 是的。来自 Visual Studio 属性编辑器。 pbWaiting.Maximum = 100pbWaiting.Visible = true
  • 您使用的是什么 INTERVAL?如果它太大,可能是在任务完成时它没有触发?此外,无论实际进展如何,这都会算上?这只是虚拟代码吗?
  • @Belogix 我认为这不太可能。默认情况下,Timer.Interval 设置为 100 毫秒。
  • 这里的问题是,当它开始加载数据库时,它主要锁定整个窗口,在所有内容完全加载之前不允许任何其他事情发生(比如你的进度条)。我建议您为此使用线程,以便您的进度条在获取数据的同时运行。我从albahari.com/threading 学到的一个很好的例子

标签: c# timer progress-bar


【解决方案1】:

在您的 UI 线程上运行的 Load 事件处理程序正在调用 PopulateServerInstances,这可能在加载数据时被阻塞。您需要在 BG 线程上完成这项工作,以便您的 UI 线程可以继续更新 UI。 BackgroundWorker 是您最好的选择,因为它支持在您进行时更新 UI 线程上的进度信息。

【讨论】:

  • 我不确定Load 事件处理程序。我有一个 Winforms,它在其 Load 事件中完成了大部分工作,并且其中的进度条工作得很好(尽管进度条正在通过委托在后台线程中更新)
  • 另外一点,在填充方法完成之前不会显示您的表单。
  • @Nolonar:这只有在您定期调用 Application.DoEvents() 以泵送所有 UI 事件,或者您的处理程序以某种方式被编组到另一个线程时才有意义。
  • 谢谢。就是这样。我的Load 事件在填充列表时会阻塞 UI。我将尝试使用 BG 实现代码。 @Taner 你是对的。在方法完成之前,我的表单不会显示。
  • @KentBoogaart 你是对的。我完全忘记了我的表单将其工作推到另一个线程上,+1 指出这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多