Как сообщить о прогрессе здесь?
Всем привет,
Я нашел фрагмент кода, который очень хорошо работает (кредиты автору, он называется "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 во время чтения файлов и папок с жесткого диска?