2015-11-03 87 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

相關問題