2011-06-15 3 views
1

В настоящее время я работаю с threading и backgroundworker в C#. Проблема в том, что это. Скажем, у меня есть основной поток для взаимодействия с пользователем и рабочий поток для обработки файлов txt (различные операции редактирования). Затем после того, как backgroundthread запускает свое содержимое один раз, у меня есть запуск таймера, который выполняет другой набор операций. Я хочу, чтобы эти новые операции выполнялись таймером за считанные минуты в одном и том же фоновом потоке без выполнения предыдущих операций, связанных с ним, перед запуском таймера. Как это может быть сделано?Background threading in C#

+0

Почему бы не начать новую тему? –

+0

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

+0

@Justin C Этот таймер работает в методе timer_Elapsed. Как вы вызываете backgroundworker1_DoWork из потока таймера? – hWorld

ответ

1

Вы должны использовать только System.Timers.Timer, который будет выполнять обратный вызов в потоке пула потоков.

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

+0

Что означает обратный вызов потока потока потока? – hWorld

+0

Событие 'Tick' будет запускаться в потоке из ThreadPool, как и' BackgroundWorker'. (Хотя и не обязательно одна и та же) – SLaks

0

Вы хотите использовать метод Event Driven для выполнения вызовов функций вашего рабочего потока из потока пользовательского интерфейса. Способ сделать это с помощью BeginInvoke, вы можете прочитать больше о том, как использовать его здесь: http://www.dreamincode.net/forums/topic/35616-cross-thread-communication-in-c%23/

0

Добавьте время цикла к концу вашего фона рабочего:

в то время как (! Остановка) {Thread.sleep (yourIntervalinMilliseconds); ...}

Я бы создал стоп-лосс где-то, на что смотрит поток, когда вы хотите, чтобы его выгнали.