Я просмотрел довольно много потоков здесь и на других сайтах для решения этой проблемы.
Здесь мой класс FileMonitor:
class FileMonitor
{
    public FileMonitor(String path)
    {
        try
        {
            var watcher = new FileSystemWatcher()
            {
                Path = path,
                IncludeSubdirectories = true,
                InternalBufferSize = 65536,
                EnableRaisingEvents = true
            };
            watcher.Changed += new FileSystemEventHandler(OnFileChanged);
            watcher.Created += new FileSystemEventHandler(OnFileCreated);
            watcher.Deleted += new FileSystemEventHandler(OnFileDeleted);
            watcher.Renamed += new RenamedEventHandler(OnFileRenamed);
            watcher.Error += new ErrorEventHandler(OnWatcherError);
        }
        catch (Exception)
        {
            throw;
        }
    }
    private void OnWatcherError(object sender, ErrorEventArgs e)
    {
    }
    private void OnFileChanged(object sender, FileSystemEventArgs e)
    {
        try
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = false;
            LogFileSystemChanges(e);
        }
        finally
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = true;
        }
    }
    private void OnFileCreated(object sender, FileSystemEventArgs e)
    {
        try
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = false;
            LogFileSystemChanges(e);
        }
        finally
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = true;
        }
    }
    private void OnFileDeleted(object sender, FileSystemEventArgs e)
    {
        try
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = false;
            LogFileSystemChanges(e);
        }
        finally
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = true;
        }
    }
    private void OnFileRenamed(object sender, RenamedEventArgs e)
    {
        try
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = false;
            LogFileSystemRenaming(e);
        }
        finally
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = true;
        }
    }
    private void LogFileSystemChanges(FileSystemEventArgs e)
    {
        string log = string.Format("{0:G}: {1} | {2}", DateTime.Now, e.FullPath, e.ChangeType);
        Console.WriteLine(log);
    }
    private void LogFileSystemRenaming(RenamedEventArgs e)
    {
        string log = string.Format("{0:G}: {1} | Old name: {2}", DateTime.Now, e.FullPath, e.OldName);
        Console.WriteLine(log);
    }
}
Как вы можете сказать, я попробовал "блокировку" ((FileSystemWatcher)sender).EnableRaisingEvents = false;, но могу сказать, что с моего вывода на консоль мои события запускаются дважды.
Есть идеи по этому поводу? Я действительно не уверен, куда идти отсюда.
