Модель Threading в UI
Пожалуйста, прочитайте Threading Model в приложениях пользовательского интерфейса, чтобы понять основные понятия. Ссылка перемещается на страницу, описывающую модель потоков WPF. Тем не менее, Windows Forms использует ту же идею.
Пользовательский интерфейс
- Существует только один поток (поток пользовательского интерфейса), которому разрешен доступ к System.Windows .Forms.Control и его подклассы.
- Попытайтесь получить доступ к члену System.Windows.Forms.Control из другого потока, кроме потока пользовательского интерфейса, вызовет перекрестный поток Исключение.
- Поскольку существует только один поток, все операции пользовательского интерфейса помещаются в качестве рабочих элементов в этот поток:
[/g22]
[/g23]
Методы BeginInvoke и Invoke
- Вычисление вычислительных ресурсов вызываемого метода должно быть небольшим, а также вычислить накладные расходы на методы обработчика событий, поскольку U Здесь используется поток I - тот же самый, который отвечает за обработку ввода пользователя. Независимо от того, является ли это System.Windows.Forms.Control.Invoke или System.Windows.Forms.Control.BeginInvoke .
- Для выполнения вычисления дорогостоящей операции всегда используйте отдельный поток. Поскольку .NET 2.0 BackgroundWorker предназначен для выполнения дорогостоящих операций в Windows Forms. Однако в новых решениях вы должны использовать шаблон async-await, описанный здесь здесь .
- Используйте System.Windows.Forms.Control.Invoke или System.Windows.Forms.Control.BeginInvoke только для обновления пользовательского интерфейса. Если вы используете их для тяжелых вычислений, ваше приложение заблокирует:
[/g24]
Вызвать
[/g25]
BeginInvoke
[/g26]
Решение для кода
Прочитать ответы на вопрос Как обновить графический интерфейс из другого потока в C #? . Для C # 5.0 и .NET 4.5 рекомендуемым решением является здесь .
задан Nico Schmidt 28 November 2013 в 14:02
поделиться