Filewatcher и управление очередями

я просматриваю каталог на предмет удаления, добавления и изменения. Я начал с доп. Время обработки заставляет меня иметь управление очередью, иначе я пропущу много файлов, добавленных в каталог. Вот код: Декларация:

static ConcurrentQueue<string> q = new ConcurrentQueue<string>();

Затем в Form_load :

Task.Factory.StartNew(filesAdded);

функция просмотра файлов:

private void fileSystemWatcher1_Created_1(object sender, FileSystemEventArgs e)
    {
        q.Enqueue(e.FullPath);
    }

И затем функция filesAdded:

        void filesAdded ()
    {
        bool run = true;
        AppDomain.CurrentDomain.DomainUnload += (s, e) =>
        {
            run = false;
            q.Enqueue("stop");
        };
        while (run)
        {
            string filename;
            if (q.TryDequeue(out filename) && run)
            {
                Globals.getTags(filename);
                Globals.ecritDs(filename, true);
            }
        }
    }

кредит принадлежит Рене здесь

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

 private void fileSystemWatcher1_Deleted(object sender, FileSystemEventArgs e)
    {}
 private void fileSystemWatcher1_Changed(object sender, FileSystemEventArgs e)
    {}

Я хотел бы получить информацию о триггере в функции filesAdded (которую, очевидно, нужно переименовать), но я понятия не имею, как это сделать, поскольку метод Enqueue принимает только один параметр. Любая помощь приветствуется!


person Sebastien Chemouny    schedule 22.05.2020    source источник
comment
Вместо ConcurrentQueue‹string› используйте ConcurrentQueue‹YourClass›, а затем определите класс, который содержит информацию, необходимую для обработки. Кстати, FileSystemWatcher имеет буфер, который по умолчанию относительно мал. Вы можете просто увеличить размер и не удалять события   -  person pinkfloydx33    schedule 23.05.2020
comment
ааа не подумал об этом! спасибо :)   -  person Sebastien Chemouny    schedule 23.05.2020


Ответы (1)


Благодаря pinkfloydx33 я использую класс:

 private class FileWatched
    {
        public string fp { get; set; }
        public string trigger { get; set; }
    }

а затем в цикле filesAdded:

 while (run)
        {
            if (q.TryDequeue(out fw) && run)
            {
                switch (fw.trigger)
                    {
                    case "created":
                        Globals.getTags(fw.fp);
                        Globals.ecritDs(fw.fp, true);
                        break;
                    case "modified":
                        break;
                    case "deleted":
                        break;
                    }
            }
        }
person Sebastien Chemouny    schedule 22.05.2020