FileSystemWatcher вызывает сбой на рабочем столе - PullRequest
11 голосов
/ 06 января 2012

Я пишу решение, в котором я использую некоторые файлы конфигурации, которые должны редактироваться во время выполнения.Раньше я использовал FileSystemWatcher для этой цели и никогда не испытывал особых проблем с ним, но теперь он вызывает CTD для события 'rename'.

Этот (бесполезный) фрагмент кода воссоздает проблему вмои настройки:

private static int _s_renamed;
private static int _s_created;
private static int _s_errors;

private static void monitorConfiguration(string configRootFolder)
{
    var fsw = new FileSystemWatcher(configRootFolder, ConfigFilePattern)
    {
        NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName,
        IncludeSubdirectories = false
    };
    fsw.Renamed += (sender, args) => ++_s_renamed; // <-- ! CTD efter this one !
    fsw.Created += (sender, args) => ++_s_created;
    fsw.Error += (sender, args) => ++_s_errors; 
    fsw.EnableRaisingEvents = true;
}

Авария происходит от FileSystemWatcher, кажется.Если я устанавливаю точку останова в обработчике событий для FileSystemWatcher.Renamed, она срабатывает, но приложение вылетает, когда я выхожу из нее.Если я установлю точку останова в обработчике событий FileSystemWatcher.Created, этого не произойдет.

Есть предложения?


РЕДАКТИРОВАТЬ 1: Я использую .NET 4 на Windows 7 x64(Ultimate) платформа Я видел несколько дискуссий, касающихся проблем такого типа, но все они были связаны с людьми, пытающимися обновить содержимое пользовательского интерфейса (что должно быть сделано из основного потока / потока пользовательского интерфейса) из обработчиков событий.Вот почему я просто пытаюсь увеличить счетчики в экспериментальном коде.

Ответы [ 4 ]

1 голос
/ 10 апреля 2012

Просто чтобы уточнить:

Проблема заключалась в том, что у меня было больше / старше потребителей FileSystemWatcher в других местах моей системы, и один из них вызвал необработанное исключение. Проблема в том, что исключение возникает в совершенно другом потоке и приводит к сбою приложения на рабочем столе. Выбор времени обманул меня, заставив думать, что именно мой новый потребитель каким-то образом стал причиной возникновения проблемы, но когда я последовал совету Криса Шейна (см. Комментарии в записи вопроса), чтобы разрешить разрыв исключений ( msdn.microsoft.com / en-us /) library / d14azbfh.aspx ) Я сразу нашел настоящего преступника.

Я бы предпочел доверить Крису решение, но он никогда не публиковал сообщения, так что вот оно. Надеюсь, мы чему-то научились.

Спасибо всем и счастливого кодирования

/ Jonas

0 голосов
/ 18 января 2012

В .NET вы должны синхронизировать поток, сгенерированный FileSystemWatcher, с потоком пользовательского интерфейса.Для этого элементы управления пользовательского интерфейса имеют такой метод, как: myControl.Invoke (...) для этого эффекта.Любой другой способ синхронизации будет иметь некоторые случайные эффекты, такие как сбои, исключения и т. Д.

см. Здесь: http://msdn.microsoft.com/en-us/magazine/cc300429.aspx http://weblogs.asp.net/justin_rogers/pages/126345.aspx

надеюсь, это поможет

0 голосов
/ 23 марта 2012

Возможно, ваш файл или объект используется, у меня была похожая проблема, и я решил ее, используя следующий код

private void InitWatch()
{
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = @"C:\LoQueSea";
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
    | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    watcher.Filter = "*.*";
    watcher.Created += new FileSystemEventHandler(OnCreated);
    watcher.EnableRaisingEvents = true;
}
private void OnCreated()
{
    try
    {
        if (!myObjectToPrint.Dispatcher.CheckAccess())
        {
            myObjectToPrint.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
                new Action(
                   delegate()
                   {
                    //your code here...
                   }
                   )
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }          
}

Saludos ..

0 голосов
/ 08 января 2012

Вы можете столкнуться с любой из этих трех ситуаций

  1. Переданный каталог не существует, и файл io not found создается.
  2. Переданный каталог являетсядопустимо, но процесс, выполняющий его, не имеет прав доступа
  3. Аргументы (отправитель, аргументы) в том виде, в котором они были переданы, может быть нулевым и ваш код (так как это пример, а мы не можем увидеть реальный код)) не обрабатывает нуль и выдает ошибку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...