Проблема мониторинга каталога для файловой активности в VB.net 2010 - PullRequest
2 голосов
/ 18 января 2011

Я пытаюсь написать простую программу для отслеживания папок на наличие новых файлов в VB.NET 2010, и у меня возникли некоторые проблемы.

Вот упрощенная версия моей программы:

Imports System.IO

Public Class Main
    Public fileWatcher As FileSystemWatcher

    Sub btnGo_Click(sender As System.Object, e As System.EventArgs) Handles btnGo.Click
        '//# initialize my FileSystemWatcher to monitor a particular directory for new files
        fileWatcher = New FileSystemWatcher()
        fileWatcher.Path = thisIsAValidPath.ToString()
        fileWatcher.NotifyFilter = NotifyFilters.FileName
        AddHandler fileWatcher.Created, AddressOf fileCreated
        fileWatcher.EnableRaisingEvents = True
    End Sub

    Private Sub fileCreated(sender As Object, e As FileSystemEventArgs)
        '//# program does not exit when I comment the line below out
        txtLatestAddedFilePath.Text = e.FullPath
        '//# e.FullPath is valid when I set a breakpoint here, but when I step into the next line, the program abruptly halts with no error code that I can see
    End Sub
End Class

Как видите, у меня есть кнопка, которая при нажатии инициализирует FileSystemWatcher. Инициализация работает, и когда я помещаю новый файл в контролируемый каталог, программа достигает подпрограммы fileCreated. Я даже вижу, что e.FullPath установлено правильно. Однако сразу после этого он выходит без кода ошибки (в любом случае, я не вижу). Если я прокомментирую все в подпункте fileCreated, программа продолжит работу, как и ожидалось.

Есть идеи, почему он умирает от меня? Любая помощь будет принята с благодарностью. Я довольно новичок в VS / VB.NET, так что, возможно, я просто делаю глупую ошибку. Спасибо!

1 Ответ

3 голосов
/ 18 января 2011

Может быть исключение операции между потоками.

Попробуйте это:

Private Sub fileCreated(sender As Object, e As FileSystemEventArgs)
  me.Invoke(New MethodInvoker(Function() txtLatestAddedFilePath.Text = e.FullPath))
End Sub

или (еще лучше в вашем контексте) при инициализации fileWatcher:

fileWatcher = New FileSystemWatcher()
fileWatcher.SynchronizingObject = me
[...]

Пояснение:

http://www.blackwasp.co.uk/FileSystemWatcher.aspx (см. Предотвращение операций с перекрестными потоками )

Выдержка:

По умолчанию, когда FileSystemWatcher объект вызывает уведомления о событиях, вызовы делегатов сделаны в потоке из пула системных потоков. Это будет как правило, не такая же тема, как что используется для контроля формы. В качестве демонстрационного приложения требует, чтобы изменения файла были вошли в визуальный элемент форма, используя выделенный поток для изменить содержимое списка привести к операции многопоточности и исключение IllegalOperationException выброшены.

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