По сути, FileSystemWatcher использует некоторые из встроенных хуков для подписки на изменения и просто заставляет ОС вызывать ваших делегатов, когда происходит изменение. Поэтому все, что вам нужно сделать, это остановить выход из основного потока, он не должен ничего делать; К тому времени, как вы дойдете до этой строки, основная часть вашей программы закончилась, она сделала то, что ей нужно было сделать.
Простой способ сделать то, что вы хотите, - внести это изменение в образец из MSDN;
//while (Console.Read() != 'q') ;
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
Это переведет ваш основной поток в спящий режим навсегда, но все равно позволит делегатам запускать и реагировать на изменения в каталоге. Обратите внимание, что он будет продолжать проходить через несколько изменений (так же, как образец MSDN).
Обратите внимание, что "while" в образце MSDN на самом деле мало что дает; Вы можете заменить эту строку просто на «Console.Read ()», которая затем заставит любой ключ выйти из приложения. Это всего лишь строка, которая запрещает выходу основного потока, чтобы он оставался активным при поступлении уведомлений о событиях.
Тем не менее, использование Sleep (Timeout.Infinite) оставляет ваше приложение в состоянии, когда оно не может быть легко остановлено пользователем, кроме как путем его закрытия. Если вы пишете это как консольное приложение, почему бы не придерживаться «нажмите Q, чтобы выйти»? Если вместо этого вы решите написать его как службу, вероятно, все будет в порядке, если вы обрабатываете события выключения / перезапуска и т. Д.