UI未快速更新

3

晚上好,

以下是我用于从驱动器等读取文件和文件夹的代码。

Public Class LoadingBox

    Public counter As ULong
    Public OpenRecords As New Dictionary(Of String, MainWindow.records)
    Public Path As String
    Public Diskname As String
    Private WithEvents BKWorker As New BackgroundWorker()


    Public Sub New(ByVal _Path As String, ByVal _Diskname As String)

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        Path = _path
        Diskname = _diskname
    End Sub

    Private Sub GetStructure(ByVal tempdir As String, ByVal ParentID As String, ByVal DiskName As String)
        Dim maindir As DirectoryInfo = My.Computer.FileSystem.GetDirectoryInfo(tempdir)
        For Each Dir As DirectoryInfo In maindir.GetDirectories
            Try
                Dim d As New MainWindow.records
                d.Filename = Dir.Name
                d.Folder = True
                d.Rowid = Date.UtcNow.ToString() + counter.ToString()
                d.Size = 0
                d.ParentID = ParentID
                d.DiskName = DiskName
                d.DateCreated = Dir.CreationTimeUtc
                d.DateModified = Dir.LastWriteTimeUtc
                OpenRecords.Add(d.Rowid, d)
                'Label1.Content = "Processing: " + Dir.FullName
                BKWorker.ReportProgress(0, Dir.FullName)
                counter = counter + 1
                GetStructure(Dir.FullName, d.Rowid, DiskName)
            Catch ex As Exception

            End Try


        Next
        For Each fil As FileInfo In maindir.GetFiles
            Try
                Dim d As New MainWindow.records
                d.Filename = fil.Name
                d.Folder = False
                d.Rowid = Date.UtcNow.ToString() + counter.ToString()
                d.Size = fil.Length
                d.ParentID = ParentID
                d.DiskName = DiskName
                d.DateCreated = fil.CreationTimeUtc
                d.DateModified = fil.LastWriteTimeUtc
                OpenRecords.Add(d.Rowid, d)
                'Label1.Content = "Processing: " + fil.FullName
                BKWorker.ReportProgress(0, fil.FullName)
                counter = counter + 1
            Catch ex As Exception

            End Try

        Next
    End Sub

    Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
        counter = 0
        BKWorker.WorkerReportsProgress = True
        AddHandler BKWorker.DoWork, AddressOf BKWorker_Do
        AddHandler BKWorker.ProgressChanged, AddressOf BKWorker_Progress
        AddHandler BKWorker.RunWorkerCompleted, AddressOf BKWorker_Completed
        BKWorker.RunWorkerAsync()

        'GetStructure(Path, "0", Diskname)
    End Sub

    Private Sub BKWorker_Do(ByVal sender As Object, ByVal e As DoWorkEventArgs)
        'Throw New NotImplementedException
        GetStructure(Path, "0", Diskname)
    End Sub

    Private Sub BKWorker_Progress(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
        'Throw New NotImplementedException
        Label1.Content = "Processing: " + e.UserState.ToString()
        If ProgressBar1.Value = 100 Then
            ProgressBar1.Value = 0
        End If
        ProgressBar1.Value = ProgressBar1.Value + 1
    End Sub

    Private Sub BKWorker_Completed(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
        'Throw New NotImplementedException
        MessageBox.Show("Completed")
        Me.Close()
    End Sub
End Class

然而问题在于,后台线程能够非常快地读取文件,但UI线程无法跟上其速度,请问您如何解决这个问题。
2个回答

4

当您遍历如此多的项目时,几乎从不希望报告每个项目的进度。

我建议在报告进度之前等待一些合理数量的文件。例如每5个或每10个文件报告一次进度。您可能需要查看您通常处理的文件数量。换句话说,如果您通常只处理25个文件,则不要仅在处理10个文件后更新进度。但是,如果您通常处理25000个文件,则甚至可以每100个文件更新一次进度。


非常感谢您的快速回复。按照您的建议解决了问题。 - surpavan

3
一种快速的解决方案是只在经过一定时间后报告进度,这样如果在此期间处理了10个文件,则UI不会尝试更新每个文件的进度。如果处理速度如此之快,那么您真的不需要在每个文件上向用户报告。
另外,如果您的ProgressBar实际上没有报告0到100%的进度,您可能希望将其IsIndeterminate属性设置为true,而不是增加百分比,然后将其重置为0。

非常感谢您的快速回复。按照您的建议解决了问题,并注意到了IsIndeterminate,感谢您的信息化。 - surpavan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接