2012-06-02 5 views
3

Я использую FileSystemWatcher В измененном событии я хочу передать целочисленную переменную.Как передать переменную в событие на C#?

например.

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

на fileSystemWatcher_Changed, я хочу взять значение счетчика, а затем сделать некоторую работу. Но как мне получить это значение.

если я делаю подсчет глобальной переменной, это недействительно, потому что счет изменяется с каждым измененным событием файла и передается от пользователя.

+0

Показать соединения между Count, Watcher и Owner (Form?). Это Desktop или Asp.net? –

+0

это asp.net – InfoLearner

ответ

5

Самый простой подход заключается в использовании лямбда-выражения:

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

Это звучит, как вы можете пройти по ссылке count, хотя, если метод хочет обновить значение.

+1

Что такое HandleWatcherChanged? – InfoLearner

+0

@KnowledgeSeeker это имя метода, заменяющего вашу 'fileSystemWatcher_Changed (..)'. Вы можете использовать 'HandleWatcherChanged (count, sender, args)', если вам нужен доступ к этим исходным параметрам – Adam

+1

ok thanks. что означает (отправитель, args) => означает кстати? – InfoLearner

3

Почему вы не являетесь подклассом FileSystemWatcher и передаете свой счет в конструктор подкласса?

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

Если вы хотите знать, как часто вызывается глобально, вы также можете использовать статическую переменную. Если вы хотите узнать количество вызовов в одном конкретном экземпляре класса, отбросьте ключевое слово static.

private static int _count; 

private void fileSystemWatcher_Changed(object sender, EventArgs e) 
{ 
    Console.WriteLine("fileSystemWatcher_Changed was called {0} times", 
         ++_count); 
} 
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); 
    } 
} 
Смежные вопросы