Sonhospa Ответов: 1

Как сообщить о прогрессе здесь?


Всем привет,

Я нашел фрагмент кода, который очень хорошо работает (кредиты автору, он называется "ThreadedFileCollector") для моей цели перечисления определенных файлов по удаленной сети. Мое дополнительное требование-это отчет в пользовательский интерфейс, чтобы сигнализировать, что "длительная задача" все еще работает и никакая ошибка не заморозила экран.

К сожалению, у меня нет очень хорошего представления о том, что на самом деле происходит во время выполнения запросов (я бы предположил, что это LINQ?). Знаете ли вы, где / как я должен был бы вставить код для обновления пользовательского интерфейса?

Большое спасибо за любые идеи или фрагменты.

Майкл

Что я уже пробовал:

Вот такая функция и есть саб:
Public Function CollectFiles(ByVal dir As String, ByVal pattern As String) As List(Of FileInfo)

    Try
        Dim di As New DirectoryInfo(dir)
        Dim queue As New ConcurrentQueue(Of FileInfo)()
        InternalCollectFiles(di, pattern, queue)
        Return queue.AsEnumerable().ToList()

    Catch ex As Exception
        MsgBox(String.Format("Error in 'CollectFiles': {0}", ex.Message))
        Return Nothing

    End Try

End Function

Private Sub InternalCollectFiles(ByVal dir As DirectoryInfo, ByVal pattern As String, ByVal queue As ConcurrentQueue(Of FileInfo))

    If dir.FullName.Contains(My.Computer.Name) Then
        ' new directoryinfo, if single computer
        dir = New DirectoryInfo(Right(dir.FullName, 2).Replace("$", ":\"))
    End If

    Try
        For Each result As FileInfo In dir.GetFiles(pattern).Select(Function(file) file) _
         .Where(Function(s) supportedExtensions.Contains(Path.GetExtension(s.Extension).ToLower()))
            'Dim msg As String = String.Format("{0}", dir.FullName)
            'UIDelegate.Invoke(msg, "")
            queue.Enqueue(result)
        Next result
        Task.WaitAll(dir.GetDirectories().Select(Function(d) Task.Factory.StartNew(Sub() InternalCollectFiles(d, pattern, queue))).ToArray())

    Catch e As UnauthorizedAccessException
    Catch e As SecurityException
    Catch e As DirectoryNotFoundException

    Catch ex As Exception
        MsgBox(String.Format("Error in 'InternalCollectFiles': {0}", ex.InnerException))

    End Try

End Sub

Dave Kreskowiak

Прогресс чего? Вы не можете знать количество задействованных файлов и каталогов, не пройдя по дереву каталогов заранее. Поэтому, если вы этого не сделаете, вы не сможете определить, что означает 100%.

Это означает, что лучшее, что вы можете сделать для "прогресса", - это шатер. Непрерывно вращающаяся полоса или значок, который просто говорит: "что-то происходит", но нет никакого способа определить, сколько времени это займет.

Sonhospa

Привет, Дэйв, спасибо (еще раз) за ваш ответ. Извините, что я использовал неправильную ссылку (не "ответ"), чтобы ответить так очевидно, что не получил уведомления - другой участник дал этот намек на мою ошибку.

Sonhospa

Спасибо, Дэйв. Я намеревался (например) показать текущий поисковый каталог в строке состояния. Вызов делегата комментируется (зеленым цветом), так как при активном вызове он приводит к ошибке (что-то вроде этого). как и в брейкмарке "код не доходит до этой строки и изменился".

Я не уверен, что было бы разумно дать разрешение на (любые) изменения.

CHill60

Используйте ссылку ответить на комментарий, чтобы уведомить участника о том, что вы ответили

Sonhospa

Спасибо, Chill60. Я не совсем правильно понял, так что твой намек, релли, помогает.

Maciej Los

Этот вопрос-еще один репост. Просто шучу! :смеяться:

Вы хотите показать progressbar во время чтения файлов и папок с жесткого диска?

1 Ответов

Рейтинг:
1

Maciej Los

Цитата:
Знаете ли вы, где / как я должен был бы вставить код для обновления пользовательского интерфейса?


Как мы уже обсуждали здесь: Почему ошибка "часть пути не найдена"?[^], перечисление файлов и папок надлежащим образом немного сложно, особенно когда вы используете много типов коллекций, которые не являются потокобезопасными. То, как вы захватываете данные в процессе перечисления файлов и папок, также может повлиять на время и реакцию пользовательского интерфейса (зависает/зависает).

Итак, у вас есть 3 возможности:
1) Не отображать индикатор выполнения,
2) отображение индикатора выполнения:
а) вычисление стоимости операции при запуске (как это делает ОС Windows при копировании/удалении файлов/папок),
б) отображение информации при выполнении операции (в случае, когда общее количество, размер или количество материала неизвестно)

Имейте в виду, что существует несколько типов индикаторов выполнения, см.: О прогресс бар Управление - приложениями Windows и Microsoft документы[^]
- Диапазон и текущее положение - представляет собой прогресс, достигнутый приложением в выполнении операции,
- Стиль шатра - показывает активность, но не указывает, какая часть задачи завершена.

Я бы выбрал индикатор выполнения в стиле шатра. Если вы хотите отобразить прогресс (используя индикатор выполнения или обновляя пользовательский интерфейс, например ListBox), вам нужно будет использовать Контроль.Вызов Метода (System.Окна.Формы) | Microsoft Docs[^]. Видеть:
Как сделать Потокобезопасные вызовы элементов управления Windows Forms | Microsoft Docs[^]
Как использовать фоновый поток для поиска файлов | Microsoft Docs[^]

Удачи вам!