代码之家  ›  专栏  ›  技术社区  ›  jyoung

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

wpf
  •  5
  • jyoung  · 技术社区  · 16 年前

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

    4 回复  |  直到 16 年前
        1
  •  5
  •   Bradley Grainger    16 年前

    Reflector显示了实现 ISynchronizeInvoke FileSystemWatcher.SynchronizingObject 财产)是 System.Windows.Form.Control (及其子类);似乎没有任何WPF对象实现此接口。

        2
  •  3
  •   Jeff Winn    15 年前

    您需要创建一个ISynchronizeInvoke对象,从窗口包装System.Windows.Threading.Dispatcher实例。该类是WPF与ISynchronizeInvoke对象最接近的对象。

    到目前为止,一切似乎都正常工作,但微软认为让Dispatcher类实现该接口以便于使用太糟糕了。

        3
  •  1
  •   luviktor    10 年前

    有一种方法。FileSystemWatcher在启用事件(EnableRaisingEvents=true)时会创建自己的线程来监视FS事件。例如,通过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;
    
        4
  •  -1
  •   Justin    13 年前

    这对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
    
        }