2010-02-11 2 views
1

У меня есть метод, который работает асинхронно с BackgroundWorker. Внутри этого метода некоторый код петли бесконечно с интервалом в 1000 мс.C# BackgroundWorker вопрос

Внутри этого кода, в зависимости от какого-либо значения, отправляется событие. Насколько я понял, это событие работает в том же потоке, что и код, из которого он был поднят.

Но я хочу, чтобы это событие выполнялось в том же потоке, что и объект, который содержит BackgroundWorker. Как это сделать?

+1

@Thomas: лучше всего начать отдельный поток для длительной работы (или бесконечного в вашем случае) процессов, а не использовать пул потоков/фоновый рабочий. Как сказал Адам, таймер может быть лучше подходит. –

+0

Это не реально, если вы хотите, чтобы поток ваших объектов продолжал работать. Что вы можете сделать, это использовать AutoResetEvent или ManualResetEvent, чтобы вызвать основной поток, чтобы снова начать работать или постоянно проверять volatile bool, чтобы увидеть, выполнил ли фоновый рабочий объект свою задачу. – Will

ответ

4

Вам будет лучше использовать Timer для планирования повторяющихся событий. Если это приложение Windows Forms (которое я предполагаю, так как вы хотите запустить его в контексте «владеющего» потока), вы должны использовать экземпляр System.Windows.Forms.Timer.

+1

+1 для таймера прост и прост в использовании. –

+0

Таймеры не запускают истекшие события в том же контексте, что и у владеющего потока? Их прошедшие события выполняются в отдельных потоках. – Will

+1

@Will: 'System.Threading.Timer' ведет себя так, как вы описываете. События 'System.Windows.Forms.Timer' запускаются в потоке пользовательского интерфейса. –

2

В зависимости от вашего домена и приложения вы можете использовать событие ProgressChanged (и метод ReportProgress), который выполняется в нужном вам потоке.

0

Является ли ваша «получающая» нить нитью графического интерфейса? Если это так, посмотрите Control.Invoke() или Control.BeginInvoke(). Предполагая, что это ваша форма или некоторый контроль над вашей формой, который обрабатывает это периодическое событие, тогда вы должны это сделать.

+0

да .. no ^^ Invoke был бы идеальным, но Thread - это не GUI Thread вообще .. попытался реализовать ISynchronizeInvoke тоже .. но это было слишком сложно, так как я думал, что должен быть более простой способ .. с помощью таймера сейчас и он работает как шарм;) – Thomas

+0

Да, он работает только для потока GUI поскольку он уже получил цикл сообщений. Вам нужно будет сделать свой собственный цикл сообщений в других потоках. Не будет просто! – Andy

0

Возможно, вам необходимо взглянуть на System.Threading.SynchronizationContext, который может быть использован для публикации событий на фоне BackgroundWorker Holder.

Смежные вопросы