Я видел других с похожей проблемой, но не совсем то, что я искал. В событии dowork класса backgrounderworker я создаю экземпляр нового класса и вызываю одну из его функций. Раньше у меня был этот код в событии тика windows.form.timer, и я передал делегат в качестве одного из параметров, который позволил бы функции и другим функциям, которые она вызывает в классе, вызывать метод в форме для обновления сетки данных. на графическом интерфейсе. Есть ли способ сделать это в рамках события dowork? Мне это нужно, потому что функция, которую я вызываю из dowork, вызывает другие функции, и я хочу, чтобы каждая из этих функций регистрировала информацию в сетке данных графического интерфейса.
Можно ли обновить пользовательский интерфейс из фонового рабочего события?
Ответы (3)
Для этого предназначен метод BackgroundWorker.ReportProgress(). Вы реализуете событие ProgressChanged для обновления пользовательского интерфейса, оно будет выполняться в основном потоке. Вы не ограничены сообщением только о проценте выполнения, вы также можете передать любой объект, чтобы передать информацию обработчику событий, используя перегрузку, которая принимает аргумент userState. Помните, что вам придется использовать правильную блокировку, если вы это сделаете.
WorkerReportsProgress значение true самого фонового рабочего.
- person Scott Anderson; 23.09.2010
Помимо ReportProgess, упомянутого в ответе Ганса, вы также можете использовать Control.Invoke на одном из элементов пользовательского интерфейса для выполнения кода в потоке пользовательского интерфейса.
Вы можете отправить данные о прогрессе обратно в поток пользовательского интерфейса, вы получите событие для этого в потоке пользовательского интерфейса, а затем сможете обновить экран. Настоятельно рекомендуется, чтобы объекты, которые вы отправляете обратно в поток пользовательского интерфейса, были неизменяемыми. Помимо вызова ReportProgress и обработки события, вам необходимо подписаться, установив для свойства WorkerSupportsProgress значение true.