В приложении WPF есть ли объект, который я могу назначить FileSystemWatcher.SynchronizingObject? - PullRequest
5 голосов
/ 31 октября 2008

В приложении WPF есть ли объект, который я могу назначить FileSystemWatcher.SynchronizingObject?

Я могу сделать свой собственный, но если он есть, я бы хотел его использовать.

Ответы [ 4 ]

5 голосов
/ 31 октября 2008

Отражатель показывает, что единственный класс, который реализует ISynchronizeInvoke (то есть тип свойства FileSystemWatcher.SynchronizingObject), это System.Windows.Form.Control (и его подклассы); похоже, что нет объектов WPF, реализующих этот интерфейс.

3 голосов
/ 22 марта 2010

Вам необходимо создать объект ISynchronizeInvoke, который оборачивает экземпляр System.Windows.Threading.Dispatcher из окна. Этот класс - самое близкое, что есть у WPF к объекту ISynchronizeInvoke.

Внутри класса оболочки просто перенаправьте вызов BeginInvoke диспетчеру, которого вы завернули. Я проделал небольшую дополнительную работу, а также обернул DispatcherOperation, являющийся результатом метода Dispatcher.BeginInvoke, для вызова его метода Wait внутри метода ISynchronizeInvoke.EndInvoke.

Пока что все работает правильно, очень жаль, что Microsoft не посчитала нужным, чтобы класс Dispatcher реализовал интерфейс для простоты использования.

1 голос
/ 08 июля 2009

Есть один способ. FileSystemWatcher при включении событий (EnableRaisingEvents = true) создает собственный поток для мониторинга событий FS. Через ISynchronizeInvoke он может, например, асинхронно вызывать членов вашей формы (его поток может асинхронно взаимодействовать с основным потоком - потоком пользовательского интерфейса).

В WPF нет реализации ISynchronizeInvoke, но есть возможность взаимодействовать с потоком пользовательского интерфейса через свойство Dispatched вашего окна следующим образом:

var fsw = new FileSystemWatcher() 
{ 
    //Setting the properties: Path, Filter, NotifyFilter, etc. 
};

fsw.Created += (sender, e) => 
{ 
    Dispatcher.Invoke(new Action<params_types>((params_identifiers) => 
        { 
            //here the code wich interacts with your IU elements 
        }), here_params); 
};


//... in this way (via Dispatcher.Invoke) with the rest of events

fsw.EnableRaisingEvents = true;
0 голосов
/ 24 июля 2011

Используйте DispatcherTimer, а не системный таймер. Это будет хорошо работать для WPF.

    DispatcherTimer t1 = new DispatcherTimer();

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
         t1.Interval = new TimeSpan(0,0,0,0,200);
        t1.Tick += new EventHandler(t1_Tick);
        t1.Start();
    ...
    void t1_Tick(object sender, EventArgs e)
    {

        //some work

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