在WPF应用程序中,是否有一个对象可以分配给FileSystemWatcher.SynchronizingObject?

6
在WPF应用程序中,是否有一个对象可以分配给FileSystemWatcher.SynchronizingObject?我可以自己创建一个,但如果有可用的对象,我想使用它。
4个回答

5

反射器显示实现ISynchronizeInvoke接口的唯一类是System.Windows.Form.Control(以及它的子类),它是FileSystemWatcher.SynchronizingObject属性的类型;似乎没有任何WPF对象实现这个接口。


3
您需要创建一个ISynchronizeInvoke对象,该对象包装了来自Window的System.Windows.Threading.Dispatcher实例。这个类是WPF中最接近ISynchronizeInvoke对象的东西。
在包装类内部,只需将BeginInvoke调用转发到您已包装的调度程序即可。我做了一些额外的工作,还包装了Dispatcher.BeginInvoke方法产生的DispatcherOperation,以便在ISynchronizeInvoke.EndInvoke方法内部调用其Wait方法。
目前似乎一切都正常运行,遗憾的是微软没有考虑让Dispatcher类实现该接口以便于使用。

1

有一种方法。当您启用事件(EnableRaisingEvents = true)时,FileSystemWatcher会创建自己的线程来监视文件系统事件。通过ISynchronizeInvoke,它可以异步调用您窗体的成员,例如,(它的线程可以与主线程 - UI线程异步交互)。

在WPF中没有实现ISynchronizeInvoke,但是可以通过窗口的Dispatched属性与UI线程交互,如下所示:

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;

-1
使用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

    }

这个是否属于离题? - ygoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接