2015-11-03 39 views
1

所以我的理解是,每当使用实现IDisposable的类时,它的父类也需要实现IDisposable接口。 (使用FileSystemWatcher的FileWatcher)处理FileSystemWatcher

因此,当使用FileSystemWatcher时,处理FileSystemWatcher的正确方法是什么?我希望FileWatcher在应用程序关闭之前不要丢弃/(观看)。

我会使用负责任的所有者模式?(尝试/最终)还是其他? 我的FileWatcher是否也实现了IDisposable?我将无法使用{},因为此fileWatcher应该在整个应用程序运行期间观察文件更改。处理这种情况的正确方法是什么?

public class FileWatcher : IFileWatcher 
{ 
    private FileSystemWatcher watcher; 

    public event EventHandler<EventArgs> SettingsChanged; 

    public FileWatcher(bool start) 
    { 
     this.RegisterForChanges(); 
    } 

    public void OnChanged(object source, EventArgs e) 
    { 
     if (this.SettingsChanged != null) 
     { 
      this.SettingsChanged(source, new EventArgs()); 
     } 
    } 

    private void RegisterForChanges() 
    { 
     /// more code here etc 
     ... 
     this.watcher = new FileSystemWatcher 
          { 
           Path = directory, 
           NotifyFilter = 
            NotifyFilters.LastAccess | NotifyFilters.LastWrite 
            | NotifyFilters.FileName | NotifyFilters.DirectoryName, 
           Filter = fileName 
          }; 

     // Add event handlers. 
     this.watcher.Changed += this.OnChanged; 

     // Begin watching. 
     this.watcher.EnableRaisingEvents = true; 
    } 
+0

'FileSystemWatcher'是非常讨厌的,以使用 - 非常不可靠。如果你在它周围重用一个[现有的包装器](http://idcomlog.codeplex.com/SourceControl/latest#IdComLog.Reactive/FileSystem.cs),你会有更多的时间。链接的使用Rx,但我相信你可以找到更多。 –

回答

4

是,实施IDisposable在这种情况下正确的解决方案(在我看来)。您的对象寿命很长,并且必须超出任何特定函数调用的范围,因此所有功能范围级别的解决方案(例如using,try..finally等)都没有了。

为此,IDisposable是.NET中的标准模式,您可以在处置FileWatcher时轻松处置嵌套对象。

+0

假设我的类FileWatcher在连续运行的Windows服务中使用。它不需要一直处理,或者至少在服务停止或服务器崩溃之前进行处理。我真的不能在所有全局服务代码中使用{}。这是正确的解决方案吗?另外,如果出现这种情况,调用Dispose()的意义是什么(即服务停止/或服务器崩溃 - 不会清除内存?) – ShaneKm

+0

@ShaneKm当您的服务停止时,它会从SCM你可以正确地清理(通过调用FSW上的Dispose)。如果你的服务崩溃了,你可能无法清理 - 操作系统会在这个过程后尝试清理,这可能包括FSW,但这应该是一个非常特殊的情况:你应该尽可能地保护你的服务代码,以便避免崩溃。 – xxbbcc

+0

@ShaneKm是的,你的FSW _必须在服务退出时处置掉。长时间运行服务并不罕见,但当服务停止时,仍然需要在服务之后进行清理。当发生这种情况时,你必须手动调用Dispose,从服务的关闭代码 - 你不能使用''使用'等 – xxbbcc

1

关闭应用程序时,运行dispose方法。

根据要求的方法,当你想关闭程序时处理某些东西。

如果通过使用一个类,然后IDisposable的是用于放置类对象,但本质上你,当你要关闭的程序仍可能要做到这一点

bool myFlag = false; 
private FileSystemWatcher watcher; 
private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
      myFlag = true; 
      if(myFlag) 
      watcher.Dispose(); //Your FileSystemWatcher object 
} 
+0

OP在类中封装'FileSystemWatcher'的模式要好得多,因为它将处理事件监听器封装在一个地方。 – xxbbcc

+0

而不是将其用作熊裸体对象调用类文件的实例并使用IDisposable方法 – shawn

+0

https://msdn.microsoft.com/en-us/library/system.idisposable.dispose%28v=vs。 110%29.aspx – shawn

相关问题