Wpf 用户界面更新不快

Wpf 用户界面更新不快,wpf,vb.net,multithreading,silverlight,user-interface,Wpf,Vb.net,Multithreading,Silverlight,User Interface,晚上好, 下面是我用来从驱动器等读取文件和文件夹的代码 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 Ba

晚上好,

下面是我用来从驱动器等读取文件和文件夹的代码

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线程无法跟上它的速度,您能告诉我如何解决这个问题吗。

一个快速的答案是,如果用户界面在某一时间段内处理了10个文件,而不是每个文件都试图更新,那么只在经过一定时间后报告进度。如果处理速度如此之快,那么您真的不需要在每个文件上更新用户


另外,请注意,如果您的ProgressBar实际上没有报告从0到100%的进度,您可能只想将其
IsIndeterminate
属性设置为true,而不是增加百分比,然后将其重置回0。

当您迭代这么多项目时,您几乎不想报告每个项目的进度项目


我建议在报告进度之前找到一些合理数量的文件等待。每隔5天或10天左右。您可能想看看您的正常文件数是多少。换句话说,如果您通常只处理25个文件,那么您可能不希望每10个文件更新一次。但是,如果您正常处理25000个文件,您甚至可以每100个文件更新一次。

非常感谢您的快速回复。按照您的建议解决。非常感谢您的快速回复。按照您的建议解决问题,并注意到ISINDEMINATE,感谢提供信息。