The user interface does not update quickly

Good evening,

Below is the code that I used to read files and folders from disk, etc.

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

However, the problem is that the background thread can read files very quickly, but the user interface thread is not able to maintain speed with it, could you advise me how I can solve this problem.

+3
source share
2 answers

One quick answer will only be to report progress, when a certain amount of time has passed so if 10 files were processed during this time, the user interface does not try to update each of them. If something is being processed quickly, you really don't need to update the user on every single file.

, ProgressBar 0 100%, IsIndeterminate true , 0.

+3

, .

, . 5 10 . , , . , 25 , , , 10 . 25000 , , 100 .

+4

All Articles