Можно ли обновить пользовательский интерфейс из события dowork backgroundworker - PullRequest
1 голос
/ 23 сентября 2010

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

Ответы [ 3 ]

5 голосов
/ 23 сентября 2010

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

0 голосов
/ 23 сентября 2010

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

0 голосов
/ 23 сентября 2010

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

...