FileSystemWatcher.SynchronizingObject без формы - PullRequest
5 голосов
/ 18 февраля 2010

У меня есть приложение Windows Form, написанное на C #, в котором я использую FileSystemWatcher, чтобы отслеживать папку для новых файлов и затем выполнять некоторую обработку для них. Мое приложение предназначено для запуска в системном трее и поэтому не запускает никаких форм при запуске. Проблема в том, что событие Created запускается в отдельном потоке, и когда я пытаюсь создать экземпляр формы в событии Created, я получаю исключение ThreadStateException, в котором говорится, что мне нужно работать в SingleThreadApartment. Я думаю, что мне нужно установить свойство FileSystemWatcher.SynchronizingObject, но я не знаю, что использовать, так как в моем приложении нет основной формы.

Ответы [ 3 ]

5 голосов
/ 18 февраля 2010

Вам потребуется вызвать Application.Run () в вашем методе Main (), чтобы установить механизм синхронизации Windows Forms, чтобы FileSystemWatcher мог правильно перенаправить вызов в основной поток. Проблема, с которой вы столкнетесь, заключается в том, что основная форма станет видимой. Исправьте это, вставив этот код в класс:

    protected override void SetVisibleCore(bool value) {
        if (!this.IsHandleCreated) {
            this.CreateHandle();
            value = false;
        }
        base.SetVisibleCore(value);
    }

Нет ограничений на то, как будет выглядеть ваша форма, если вы сделаете это.

2 голосов
/ 20 марта 2012

Вам не нужно передавать какие-либо формы на Application.Run.Тогда вы можете избавиться от необходимости возиться с видимостью формы.Просто сделайте это:

var InvokerForm = new Form();
var dummy = InvokerForm.Handle; // force handle creation
Application.Run();

Только одна ошибка - создание дескриптора формы необходимо принудительно получить, обратившись к нему один раз.

1 голос
/ 18 февраля 2010

Самый простой способ сделать это - создать скрытую форму и передать ее в Application.Run.

Затем можно установить свойство SynchronizingObject для скрытой формы.

Чтобы убедиться, что это скрытая форма, установите для свойств ControlBox и ShowInTaskbar значение false.

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