FileSystemWatcher. SynchronizingObject без формы

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

5
задан AdmSteck 17 February 2010 в 21:05
поделиться

2 ответа

Внутренние классы подходят при попытке эмуляции множественного наследования. Это похоже на то, что происходит под капотом с C++: при множественном наследовании в C++ компоновка объекта в памяти фактически является конкатенацией нескольких экземпляров объекта; затем компилятор прорабатывает, как будет корректироваться указатель "this" при вызове метода. В Java отсутствует множественное наследование, но внутренний класс может использоваться для предоставления "представления" данного экземпляра под другим типом.

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

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

(Незначительным недостатком внутренних классов является то, что они добавляют один дополнительный уровень отступа в исходном коде. Это немного неудобно иногда, когда хочется сохранить код в пределах 79 столбцов.)

-121--2117810-

Корпоративные решения и поддержка.

-121--3302884-

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

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

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

5
ответ дан 14 December 2019 в 04:36
поделиться

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

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

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

1
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: