1

FileSystemWatcher多数の異なるディレクトリでを使用する C# 5.0 アプリケーションがあります。

このアプリケーションには、List<>のオブジェクトが含まれています。FileSystemWatcher各オブジェクトは、監視対象のディレクトリと、イベント ハンドラがアクセスする必要がある他の多くのデータを記述します。これらのオブジェクトのタイプはCustomDirectorySettingです。

これはサーバー アプリケーションであり、FileSystemWatcherのイベント ハンドラが頻繁に呼び出されることを期待しています。私は、彼らが自分の仕事に遅れずについていき、ファイル変更イベントへの対応が遅れないようにしなければなりません。監視されているディレクトリが、アプリケーションを実行しているマシンに対してローカルであることを追加する価値があるかもしれません。

FileSystemWatcherCustomDirectorySettingオブジェクトを各のイベント ハンドラーですばやく使用できるようにするにはどうすればFileSystemWatcherよいですか。また、この実装にタスク並列ライブラリを使用することを検討する必要がありますか? 私はTPLの初心者なので、どの側面が最も適切かについてあなたの考えをいただければ幸いです.

4

2 に答える 2

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;
}

別のオプションは、ラムダを使用することです。

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# では正しく機能しないため、ループ変数をラムダで直接使用しないことをお勧めします。

于 2013-04-10T17:56:29.580 に答える