Vb.net BackgroundWorker的ProgressChanged在工作循环结束之前不更新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

我正在编写一个WPF应用程序,它将从IMAP帐户中获取电子邮件,然后将它们导出到用户选择的文件夹中

我使用后台工作人员下载电子邮件。但是,直到循环结束,我的UI才会更新

任何提示都将不胜感激

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