Пользовательский интерфейс не обновляется быстро - PullRequest
3 голосов
/ 13 мая 2011

Добрый вечер,

Ниже приведен код, который я использовал для чтения файлов и папок с диска и т. Д.

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

Однако проблема в том, что фоновый поток можетчитать файлы очень быстро, но поток пользовательского интерфейса не может поддерживать скорость, не могли бы вы посоветовать мне, как я могу решить эту проблему.

Ответы [ 2 ]

4 голосов
/ 13 мая 2011

Вы почти никогда не хотите сообщать о прогрессе по каждому отдельному элементу, когда вы просматриваете такое большое количество элементов.

Я бы посоветовал найти какое-то разумное количество файлов для ожидания, прежде чем сообщать о прогрессе.Каждый пятый или каждый десятый или около того.Вы, вероятно, хотите взглянуть на то, каково ваше обычное количество файлов.Другими словами, если вы обычно обрабатываете только 25 файлов, вы, вероятно, не хотите обновлять только каждые 10 файлов.Но если вы обычно обрабатываете 25000 файлов, возможно, вы сможете обновить только каждые 100 файлов.

3 голосов
/ 13 мая 2011

Одним из быстрых ответов было бы сообщить о прогрессе только после того, как прошло определенное время, если 10 файлов были обработаны за это время, пользовательский интерфейс не пытается обновить по одному. Если все происходит так быстро, вам не нужно обновлять пользователя для каждого отдельного файла.

Также стоит отметить, что если ваш ProgressBar фактически не сообщает о прогрессе от 0 до 100%, вы можете просто установить для его свойства IsIndeterminate значение true вместо увеличения процента, а затем сбросить его до 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...