Есть ли способ запустить код в потоке пользовательского интерфейса при вызове его вне его? Я знаю, что в основном это требует использования control.Invoke
или control.BeginInvoke
. Моя проблема в том, что у меня нет доступа к элементам пользовательского интерфейса, чтобы использовать эти методы.Как запустить код из потока пользовательского интерфейса в C#
Моя ситуация такова:
- UI - DataGridView с DataTable набора, как это DataSource
- нить (BackgroundWorker), написанный за пределами MainForm UI, что обновления (добавляет строки) DataTable упоминалось выше
У меня были проблемы с моим приложением, поэтому я написал простое приложение с указанными выше элементами, чтобы проверить, как это работает (или, вернее, почему это не так), и я обнаружил, что:
- Когда я обновляю DataTable в потоке BackgroundWorker, DataGridview не видит этого (возможно, все события запускаются из другого потока), даже вызов DGV.Refresh() не работает (он обновляет DGV, но иногда DGV сломается и не показывает ничего или только 1 строку), только заставляя DGV освежающие с изменением размеров, прокрутка и т.д. заставляет DGV отображать данные из DataTable
- , когда я могу запустить Invoke, все работает отлично, ничего не сказать
но это просто приложение, в котором у меня есть все в одном файле. что я могу сделать с гораздо большим приложением, где мой «другой поток» не может видеть код пользовательского интерфейса? мне нужно каким-то образом передать один элемент управления как параметр, чтобы получить доступ к этому потоку? или может быть какое-то другое, гораздо лучшее решение?
Отделите источник данных и управление от пользовательского интерфейса и фона. Таким образом, любой из 2 может получить доступ к общему управлению. Посмотрите на IoC для идей. Вы также можете использовать async/await, но из-за его звука у вас вообще нет доступа к коду пользовательского интерфейса? Итак, вы манипулируете сторонней программой? – user3036342
Как насчет использования метода ReportProgress и события ProgressChanged для фактического обновления вашего пользовательского интерфейса? Они сделаны именно для этой цели. См. Http://msdn.microsoft.com/en-us/library/System.ComponentModel.BackgroundWorker%28v=vs.110%29.aspx для примера. –
Это может помочь вам: [WinForms многопоточный сценарий привязки данных, лучшая практика?] (Http://stackoverflow.com/questions/602735/winforms-multi-threaded-databinding-scenario-best-practice) – Larry