Нужна помощь в использовании потока для мониторинга текстовых файлов в указанной папке - PullRequest
2 голосов
/ 16 декабря 2010

Я пробовал несколько учебных пособий, чтобы решить мою проблему ... но это такой большой и простой -.-

Вот код:

private void btnMonitor_Click(object sender, EventArgs e)
    {
        lock (m_lock)
        {
            if (thread_isRunning)
            {
                thread_isAbortRequested = true;
            }
            else
            {
                thread_isAbortRequested = false;
                thread_isRunning = true;
                ThreadPool.QueueUserWorkItem(BackgroundMethod);
            }
        }
        //StartMonitoring();
    }

Да, я действительно следую этому методу: Как запустить поток, если нажата кнопка, и остановить его при повторном нажатии?

Вот почему мой код такой.

Прежде всего:

Моя цель программы lil - позволить пользователю ввести путь в текстовое поле, нажать кнопку монитора и BINGO, запустить поток и продолжить мониторинг указанной папки для определенных файлов (в данном случае txt), а также добавьте их в таблицу данных.

На самом деле он уже занесен в мою сетку данных ... проблема в том, что при нажатии кнопки монитора поток запускается только один раз :( и я хотел что-то вроде каждые 3 секунды новых файлов BAAZINGA !! (если они были добавлены в папка ofc)

Как вы, ребята, видите, я довольно нуб, и у меня проблемы со всеми этими потоками и вызовами, проблемы с перекрестными потоками и т. Д. ... вы знаете!

Я не прошу рабочий код, просто советы и подсказки, чтобы сделать его классным

РЕДАКТИРОВАТЬ 1:

На данный момент единственная строка с ошибкой: ThreadPool.QueueUserWorkItem (BackgroundMethod);

список ошибок говорит: Ошибка 1 Наилучшее совпадение перегруженного метода для 'System.Threading.ThreadPool.QueueUserWorkItem (System.Threading.WaitCallback)' имеет недопустимые аргументы;

Ошибка 2 Аргумент 1: невозможно преобразовать из «группы методов» в «System.Threading.WaitCallback»;

РЕДАКТИРОВАТЬ 2:

Программа получила 3 ​​основных класса (не void main LOL), которые:

Form.cs -> где я устанавливаю события кнопки, вызываю мои специальные методы

ViewerManager -> на самом деле, я не уверен насчет этого ... Я добавил конструктор и метод Execute, который вызывает GetFiles () из класса DirectoryManager

DirectoryManager -> это мой драгоценный класс, есть Execute (путь строки), он вызывает ReadFiles (путь) и GetFiles (путь) ..

GetFiles представляет собой список строк и возвращает _files (список строк), который заполняется функцией ReadFiles ().

РЕДАКТИРОВАТЬ 3:

eww, я получил обновление таблицы данных, но с использованием windows.forms.timer ..

Мехх, есть идеи без таймеров?

OBS: извините за мой ужасный английский и похожий на нуб LOL

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Как вы обнаружили, фоновый поток будет выполняться только один раз. Вам действительно нужно использовать FileSystemWatcher или какой-то таймер.

Лучше всего (если вы не хотите использовать FileSystemWatcher), чтобы использовать DispatcherTimer или цикл внутри BackgroundWorker - для того, что вы делаете, я настоятельно рекомендую DispatcherTimer, так как он обрабатывает в потоке пользовательского интерфейса, что означает, что вы можете безопасно обновлять свою сетку данных без каких-либо проблем с потоками.

0 голосов
/ 16 декабря 2010

Как насчет использования FileSystemWatcher ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...