Vb.net BackgroundWorker的ProgressChanged在工作循环结束之前不更新UI
我正在编写一个WPF应用程序,它将从IMAP帐户中获取电子邮件,然后将它们导出到用户选择的文件夹中 我使用后台工作人员下载电子邮件。但是,直到循环结束,我的UI才会更新 任何提示都将不胜感激Vb.net BackgroundWorker的ProgressChanged在工作循环结束之前不更新UI,vb.net,backgroundworker,Vb.net,Backgroundworker,我正在编写一个WPF应用程序,它将从IMAP帐户中获取电子邮件,然后将它们导出到用户选择的文件夹中 我使用后台工作人员下载电子邮件。但是,直到循环结束,我的UI才会更新 任何提示都将不胜感激 Class MainWindow Public MailRepo As MailRepository Private bw_Connect As New BackgroundWorker Private bw_Save As New BackgroundWorker Pub
Class MainWindow
Public MailRepo As MailRepository
Private bw_Connect As New BackgroundWorker
Private bw_Save As New BackgroundWorker
Public Sub New()
InitializeComponent()
bw_Connect.WorkerReportsProgress = True
bw_Connect.WorkerSupportsCancellation = True
AddHandler bw_Connect.DoWork, AddressOf bw_Connect_DoWork
bw_Save.WorkerReportsProgress = True
bw_Save.WorkerSupportsCancellation = True
AddHandler bw_Save.DoWork, AddressOf bw_Save_DoWork
AddHandler bw_Save.ProgressChanged, AddressOf bw_Save_ProgressChanged
End Sub
在bw\u Save\u ProgressChanged中您做了什么?另一方面,您可以通过使用使代码更简单。allMails.Count可以有哪些值?如果大于100,那就糟糕了!codersl:它可以是用户在一个文件夹中有多少封电子邮件。为什么大于100是不好的?@codersl只有在使用整数除法时才是这样。在VB中,与C不同,整数除法有一个单独的运算符\。通常的除法运算符/,无论数字的类型如何,都会对其进行数学除法。
Private Sub bw_Save_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
If bw_Connect.CancellationPending = True Then
e.Cancel = True
Else
SaveEmails()
End If
End Sub
Private Sub SaveEmails()
Dim allMails As IEnumerable(Of Message)
'Get All Emails in Mailbox
Try
Dim mailBox As String
Dispatcher.Invoke(DirectCast(Sub()
mailBox = comboBoxEmailFolders.SelectedValue
End Sub, Action))
allMails = MailRepo.GetAllMails(mailBox)
Catch i4e As Imap4Exception
MsgBox("Error: Folder not found" & vbCrLf & i4e.Message)
Return
End Try
Dim msg As Message
Dim msgInt As Integer = 1
'Save each message
For Each msg In allMails
bw_Save.ReportProgress(100 / allMails.Count * msgInt, Nothing)
SaveMessage(msg)
msgInt += 1
Next
End Sub
Private Sub bw_Save_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
Dim percentDone As String = e.ProgressPercentage.ToString() & "%"
updateStatus("Saving Emails " & percentDone & " done.")
progressBarStatus.Value = e.ProgressPercentage
End Sub