Почему FileSystemWatcher закрывает программу? - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть:

using System.IO;
using System.Windows.Forms;

namespace myNamespace1
{
    public partial class Form1 : Form
    {
        FileSystemWatcher watcher = new FileSystemWatcher();

        public Form1()
        {
            InitializeComponent();

            watcher.Path = @"c:\users\Me\desktop\z";
            watcher.Created += new FileSystemEventHandler(watcher_Created);
            watcher.EnableRaisingEvents = true;
        }

        void watcher_Created(object sender, FileSystemEventArgs e)
        {
            Text = e.Name + " " + e.ChangeType.ToString();
        }

    }
}

Когда я добавляю папку или файл в папку (-z) - программа закрывается.Почему?

Я работаю в режиме отладки.И я не получаю никаких исключений от VS.

РЕДАКТИРОВАТЬ:

Ответ:

Джон-Скит ответ

+ (в комментарии)

В Visual Studio вы можете перейти в Меню отладки -> Исключения.В этом диалоговом окне убедитесь, что рядом с «Исключениями времени выполнения общего языка» установлены флажки «Брошено» и «Необработанный пользователь», нажмите кнопку «ОК» и повторите попытку отладки.- тире

Ответы [ 5 ]

2 голосов
/ 08 декабря 2011

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

Попробуйте вместо этого:

void watcher_Created(object sender, FileSystemEventArgs e)
{
    Action action = () => Text = e.Name + " " + e.ChangeType;
    // Or Dispatcher.Invoke - it depends on your application type
    Invoke(action);
}
2 голосов
/ 08 декабря 2011

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

Обновление

После просмотра вашей правки, кажется, что Джон прав (как обычно). Ваше приложение пытается обновить свойство Text в неправильном потоке. Ваш обработчик действительно должен быть:

Action a = () => e.Name + " " + e.ChangeType.ToString();
Invoke(a);
1 голос
/ 08 декабря 2011

Что такое Text, и что с ним происходит, когда происходит событие?

Имейте в виду, что FileSystemWatcher создает собственный поток из пула потоков для обработки событий. Кроме того, под капотом этого класса есть много неуправляемого кода, что может привести к незаметному проглатыванию необработанных исключений, если в опциях отладчика включен параметр «Просто мой код».

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

1 голос
/ 08 декабря 2011

В дополнение к ответу Джастина, вы можете указать только каталог для свойства Path.

Чтобы отслеживать изменения в определенном файле, используйте свойство Filter.

Также попробуйте добавить некоторую обработку исключений или пройтись по коду в режиме отладки, чтобы увидеть, что происходит. Обратите пристальное внимание на то, как вы устанавливаете метку, хотя я ожидаю увидеть исключение между потоками.

Вы видите какие-либо исключения?

0 голосов
/ 08 декабря 2011

Это служба Windows? Обычно, если средство просмотра файлов не может найти папку или не имеет доступа к папке, оно умирает. Вы проверили ваш EventLog?

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