2013-04-10 69 views
1

我有C#5.0應用程序,涉及在多個不同的目錄上使用FileSystemWatcher使數據可用FileSystemWatcher事件處理程序

此應用程序包含對象的List<>。每個對象都描述了受監視的目錄以及需要由FileSystemWatcher事件處理程序訪問的許多其他數據。這些對象類型爲CustomDirectorySetting

這是一個服務器應用程序,我期望FileSystemWatcher的事件處理程序會經常被調用。我必須確保他們能跟上自己的工作,並且不會落後於迴應文件變更事件。值得一提的是,被監視的目錄對運行應用程序的機器是本地的。

我該如何讓FileSystemWatcherCustomDirectorySetting對象快速提供給每個FileSystemWatcher的事件處理程序,並且我應該在使用Task Parallel Library來執行此實現嗎?我是TPL的新手,所以我很感謝您對哪些方面最合適的想法。

+0

什麼是CustomDirectorySetting對象? – Paparazzi 2013-04-10 14:20:43

+0

@Blam - 對於混淆抱歉 - 我應該解釋說這是一種特定於應用程序的自定義類型。它不是BCL的一部分。 – STLDeveloper 2013-04-10 16:22:37

回答

0

由於FileSystemWatcher似乎可用作基類,因此可以從中派生自己的類並添加CustomDirectorySetting類型的屬性。

+0

我沒想過要試試這個。我肯定會給它一個鏡頭。 – STLDeveloper 2013-04-10 16:24:28

0

與nvoigt說的相反,我認爲創建一個從FileSystemWatcher派生的類型是一種矯枉過正。

更好的選擇是讓您的CustomDirectorySetting類型的事件處理程序,這意味着它將能夠通過this訪問您需要的數據。

class CustomDirectorySetting 
{ 
    public string Directory { get; set; } 

    public void OnChanged(object sender, FileSystemEventArgs e) 
    { 
     // your code here 
    } 
} 

… 

List<CustomDirectorySetting> list = …; 
foreach (var setting in list) 
{ 
    var fsw = new FileSystemWatcher(setting.Directory); 
    fsw.Changed += setting.OnChanged; 
    fsw.EnableRaisingEvents = true; 
} 

另一種選擇是使用lambda:

private static void OnChanged(
    CustomDirectorySetting setting, FileSystemEventArgs eventArgs) 
{ 
    // your code here 
} 

… 

foreach (var setting in list) 
{ 
    var fsw = new FileSystemWatcher(setting.Directory); 
    CustomDirectorySetting settingCopy = setting; 
    fsw.Changed += (sender, eventArgs) => OnChanged(settingCopy, eventArgs); 
    fsw.EnableRaisingEvents = true; 
} 

在這種情況下,它可能是一個好主意,不要直接在拉姆達使用循環變量,因爲它會無法正常工作舊版本的C#。

+0

這看起來是一個非常有趣的解決方案。我的一個問題是FileSystemWatcher是否會在foreach循環的每次迭代中超出範圍時繼續正常工作。我的印象是它必須堅持才能正常運作。或者,也許一旦事件處理程序被設置,它可以被解僱? – STLDeveloper 2013-04-11 12:25:05