【问题标题】:Backgroundworker ReportProgress Firing but ProgressBar isn't changingBackgroundworker ReportProgress Firing 但 ProgressBar 没有改变
【发布时间】:2011-08-15 19:51:16
【问题描述】:

我的表单上有一个未更新的进度条。

当点击发送电子邮件按钮时,我会这样做:

Public Sub SendMail()
    If CheckSettings() = False Then Exit Sub
    BackUpEbillFile()
    LockForm(True)
    StatusBars(1, "Sending emails...")
    ProgressBar1.Maximum = intInvoicesToSend  
    BackgroundWorker1.RunWorkerAsync()
End Sub

我有以下事件:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    e.Result = SendBills()
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    Console.WriteLine("I DID IT MA!!!!1 status: " & ProgressBar1.Value)
    ProgressBar1.PerformStep()
    Console.WriteLine("I DID IT MA!!!!2 status: " & ProgressBar1.Value)
End Sub

在邮件类中的 SendBills 中,我这样做:

smtp.Send(msg)
Console.WriteLine("I DID IT PA!!!! count: " & iCount)
frmBilling.BackgroundWorker1.ReportProgress(iCount)

我的问题在于 ProgressChanged 中的 ProgressBar1.PerformStep()。我正在改变进度,但 Progressbar1 没有改变。它保持为零。

  • intInvoicesToSend 为 16
  • ProgressBar1.Minimum = 0
  • ProgressBar1.Maximum = intInvoicesToSend(原为 16)
  • ProgressBar1.Step = 1

这是来自 console.writelines 的控制台:

我做到了!!!!计数:0

我做到了!!!!1 状态:0

我做到了!!!!2 状态:1

我做到了!!!!计数:1

我做到了!!!!1 状态:1

我做到了!!!!2 状态:2

我做到了!!!!计数:2

我做到了!!!!1 状态:2

我做到了!!!!2 状态:3

我做到了!!!!计数:3

我做到了!!!!1 状态:3

我做到了!!!!2 状态:4

谁能告诉我我做错了什么? 谢谢!

【问题讨论】:

  • 为什么这里的返回不起作用?我把 intInvoicesToSend 是 16 ProgressBar1.Minimum = 0 ProgressBar1.Maximum = intInvoicesToSend(这是 16)ProgressBar1.Step = 1 都放在不同的行...
  • 你需要 2 个返回值(中间有空白行),或者格式不同(就像我在编辑中所做的那样,并将它们放在一个列表中,因为我认为它更容易阅读......)
  • LockForm 似乎运行良好,不管它做什么。
  • 谢谢里德。我不确定你是什么意思,汉斯,这是个问题吗?如果是这样,那么是的,它只是禁用了屏幕上的几个按钮。

标签: vb.net progress-bar backgroundworker


【解决方案1】:

我怀疑你在错误的实例上调用了ReportProgress 方法。

看到这一行:

frmBilling.BackgroundWorker1.ReportProgress(iCount)

如果 BackgroundWorker 直接在您的表单中定义,您可以省略 frmBilling 部分,只需将其指定为:

BackgroundWorker1.ReportProgress(iCount)

您拥有它的方式可能会导致 ReportProgress 在错误的实例上被调用...

【讨论】:

  • 感谢您的回复。正在从另一个班级调用报告进度。可能不是正确的做法,但程序写得不好,我只是在修改它。如果我删除了 frmBilling,它就看不到 BackGroundWorker。此外,偶数会正确触发,只是没有在视觉上更新进度条。
  • @ErocM:我怀疑frmBilling 指向了错误的实例。如果它在另一个类中,请确保调用者提前正确设置它...
  • 你是对的。我将方法从类中移到我的表单中,并将引用移至 frmBilling,然后我开始遇到一些跨线程异常。我修复了这些,一切都开始正常工作。感谢您的帮助!
【解决方案2】:

试试这个...

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    Console.WriteLine("I DID IT MA!!!!1 status: " & ProgressBar1.Value)
    ProgressBar1.PerformStep()
    Application.DoEvents()
    Console.WriteLine("I DID IT MA!!!!2 status: " & ProgressBar1.Value)
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多