3

FileSystemWatcher を使用しています Changed イベントで、整数変数を渡したいと思います。

例えば

int count = someValue;
 FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "C:\temp";
watcher.Changed += new FileSystemEventHandler(fileSystemWatcher_Changed);

fileSystemWatcher_Changed で、カウント値を取得してから、何らかの作業を行いたいと考えています。しかし、どうすればその値を取得できますか。

カウントをグローバル変数にすると、カウントはファイル変更イベントごとに変化し、ユーザーから渡されるため、有効ではありません。

4

5 に答える 5

5

最も簡単な方法は、ラムダ式を使用することです。

watcher.Changed += (sender, args) => HandleWatcherChanged(count);

countメソッドが値を更新したい場合は、参照渡ししたいかもしれません。

于 2012-06-02T15:15:49.847 に答える
3

FileSystemWatcherサブクラス化してカウントをサブクラスのコンストラクターに渡さないのはなぜですか?

于 2012-06-02T15:15:09.503 に答える
1

各ファイル(パス)をその数にマッピングするグローバルディクショナリを維持できます。

readonly Dictionary<string, int> filesChangeCount= 
    new Dictionary<string, int>();

次に、イベントハンドラーで、ディクショナリの適切なカウントをインクリメントします。

void fileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
{
    lock (filesChangeCount)
    {
        int count;
        filesChangeCount.TryGetValue(e.FullPath, out count);
        filesChangeCount[e.FullPath] = count++;
    }
}
于 2012-06-02T15:30:47.813 に答える
0

グローバルに呼び出される頻度を知りたい場合fileSystemWatcher_Changedは、静的変数を使用することもできます。クラスの特定の1つのインスタンスでの呼び出し数を知りたい場合は、staticキーワードを削除してください。

private static int _count;

private void fileSystemWatcher_Changed(object sender, EventArgs e)
{
    Console.WriteLine("fileSystemWatcher_Changed was called {0} times",
                      ++_count);
}
于 2012-06-02T15:31:27.727 に答える
0

変更されたハンドラーでグローバル変数を使用している場合は、変更されたイベントが複数のスレッドによって呼び出されるため、変数の使用をロックで囲む必要があることに注意してください。

private static int _count;
private object lockerObject = new object();
private void fileSystemWatcher_Changed(object sender, EventArgs e)
{
    lock(lockerObject)
    {
        Console.WriteLine("fileSystemWatcher_Changed was called {0} times",
                  ++_count);
    }
}
于 2016-12-20T03:17:20.120 に答える