BackgroundWorker的ProgressChanged直到工作循环结束才更新UI

时间:2015-09-29 22:09:48

标签: vb.net backgroundworker

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

我使用BackgroundWorker下载电子邮件。但是,在循环结束之前,我的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
    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

0 个答案:

没有答案