2010-09-22 2 views
1

Я видел других с подобной проблемой, но не совсем то, что я искал. В событии dowork класса backgrounderworker я создаю экземпляр нового класса и вызываю одну из его функций. Раньше у меня был этот код в событии tick.timer windows и передавал делегат в качестве одного из параметров, который позволял бы функции и другим функциям, которые он вызывает в классе, вызывать метод в форме для обновления datagrid на графическом интерфейсе. Есть ли способ сделать это в рамках мероприятия dowork? Мне нужно это, потому что функция, которую я вызываю из dowork, вызывает другие функции, и я хочу, чтобы каждая из этих функций записывала информацию в графический файл GUI.Возможно ли обновить пользовательский интерфейс от события dowork backgroundworker

ответ

0

. Помимо ReportProgess, упомянутых в ответе Ганса, вы можете использовать Control.Invoke на одном из элементов интерфейса для выполнения кода в потоке пользовательского интерфейса.

+0

Но в DoWork я могу передать эту способность (как параметр делегата) классу I, установленному в DoWork? – daustin

+0

@ пользователь94593: Конечно. – Heinzi

+0

Есть ли у вас пример кода? – daustin

5

Этот метод BackgroundWorker.ReportProgress() предназначен для этого. Вы реализуете событие ProgressChanged для обновления пользовательского интерфейса, оно будет работать в основном потоке. Вы не можете указывать только процент прогресса, вы можете передать любой объект, а также передать информацию обработчику событий, используя перегрузку, которая принимает аргумент user userState. Помните, что вам нужно использовать правильную блокировку, если вы это сделаете.

+0

Не забудьте установить для свойства «WorkerReportsProgress» значение true для самого рабочего фона. –

+0

Вот проблема, с которой я сталкиваюсь с использованием ReportProgress. В DoWork я вызываю функцию. Эта функция вызывает вызовы для других функций. Я хочу, чтобы все эти функции могли отправлять обновления статуса в пользовательский интерфейс. – daustin

+0

Итак, напишите функцию, которая вызывает ReportProgress, чтобы все остальные функции могли ее вызвать. Передайте делегата, если вам нужно. Будьте осторожны, маршалинг потоков очень дорог. Назовите его более ~ 1000 раз в секунду, а поток пользовательского интерфейса погаснет, когда он больше не сможет справиться. –

0

Вы можете отправить данные о ходе выполнения в поток пользовательского интерфейса, вы получите событие для него в потоке пользовательского интерфейса, после чего вы можете обновить экран. очень предпочтительно, что объекты, которые вы отправляете обратно в поток пользовательского интерфейса, неизменяемы. Помимо вызова ReportProgress и обработки события вам необходимо отказаться, установив для свойства WorkerSupportsProgress значение true.

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