2011-08-15 110 views
0

我的窗體上有一個進度條沒有更新。Backgroundworker ReportProgress發射但ProgressBar不會改變

當點擊發送電子郵件按鈕我這樣做:

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:

I DID IT PA !!!!數:0

我做到了MA !!!! 1種狀態:0

我做到了MA !!!! 2種狀態:1

我做到了PA !!!!數:1

我做到了MA !!!! 1種狀態:1

我做到了MA !!!! 2個狀態:2

我做到了PA !!!!數:2

我做到了MA !!!! 1個狀態:2

我做到了MA !!!! 2種狀態:3

我做到了PA !!!!數:3

我做到了MA !!!! 1種狀態:3

我做到了MA !!!! 2種狀態:4

誰能告訴我什麼,我做錯了什麼? 謝謝!

+0

爲什麼退貨在這裏不起作用?我把intInvoicesToSend是16 ProgressBar1.Minimum = 0 ProgressBar1.Maximum = intInvoicesToSend(它是16)ProgressBar1.Step = 1所有在不同的行... – ErocM

+0

你需要2返回(之間的空白行),或格式不同(作爲我做了我的編輯,並把它們放在一個列表中,因爲我認爲它更容易閱讀......) –

+0

LockForm似乎工作得很好,無論它做什麼。 –

回答

1

我懷疑是你在錯誤的實例上調用ReportProgress方法。

看到這一行:

frmBilling.BackgroundWorker1.ReportProgress(iCount) 

如果BackgroundWorker的是你的表單中直接定義,可以去掉的frmBilling部分,而只是將其指定爲:

BackgroundWorker1.ReportProgress(iCount) 

你的方式它可能導致ReportProgress在錯誤的實例上被調用...

+0

謝謝你的迴應。報告的進展是來自另一個班級的電話。可能不是正確的做法,但程序寫得不好,我只是觸及它。如果我刪除了frmBilling,它看不到BackGroundWorker。此外,偶數正確發射,只是沒有視覺上更新進度條。 – ErocM

+0

@ErocM:我懷疑'frmBilling'指向錯誤的實例。如果是在另一個班級,請確保呼叫者提前正確設置它... –

+0

你說得對。我將這些方法從類中移出到我的表單中,並將引用移到了frmBilling中,我開始得到一些跨線程異常。我解決了這些問題,一切開始正常。謝謝您的幫助! – ErocM

0

試試這個......

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 
相關問題