2009-04-30 4 views
1

Я использую BackgroundWorker в первый раз, и использование не совсем понятно. Могу ли я отправлять события непосредственно из обработчика DoWork, или мне нужно вместо этого вызвать ReportEvents и отправить событие из обработчика ProgressChanged?Можно ли запустить событие непосредственно из обработчика DoWork от BackgroundWorker?

ответ

1

Хотя это технически возможно поднять события и работать с UI изнутри DoWork, вы должны сделать так же, как вы бы из любого другого потока (с помощью Invoke() или BeginInvoke() для взаимодействия пользовательского интерфейса, или правильной синхронизации потоков для другие операции с поперечной резьбой), что приведет к поражению цели BackgroundWorker.

Лучшим вариантом является вызов ReportProgress(), который затем создает событие ProgressChanged в потокобезопасном режиме. Вы передаете int, представляющий процентное заполнение (хотя вам действительно нужно что-то сделать с ним) и, при желании, любой object, который вам потребуется для получения конкретной информации о событии или прогрессе. Изнутри ProgressChanged вы можете взаимодействовать с пользовательским интерфейсом, поднимать события и т. Д.

+0

Как правило, вы никогда не должны разговаривать с нитью из любого другого потока. Вы получите побочные эффекты, которые очень трудно отлаживать. Только не делай этого. Как сказал Адам, лучшим вариантом является вызов ReportProgress. – Tony

-1

Просто добавьте это в код.

void new control.CheckForIllegelCrossPathThreads == false; 
Смежные вопросы