Межпотоковое нарушение при добавлении UserControl из рабочего потока в основной поток пользовательского интерфейса в Winform - PullRequest
1 голос
/ 27 октября 2011

У меня есть приложение, на котором основана вкладка.Чтобы уменьшить время запуска, я создаю только вкладку, которая отображается пользователю.

После запуска формы я использовал BackgroundWorker для создания других вкладок.Страницы вкладок содержат пользовательские элементы управления с привязкой данных.

Работает нормально.Проблема в том, что с одной вкладкой я получаю перекрестное нарушение.Эта вкладка также имеет привязку данных.

Так в чем же проблема в этом сценарии?

Спасибо, заранее.

1 Ответ

3 голосов
/ 27 октября 2011

Элементы управления WinForms имеют сходство потоков. Средства, к которым они должны быть доступны в том же месте, где они созданы. Это потому, что WinForms на самом деле является просто оболочкой для функциональности Win32, а код, который управляет вашими окнами и дочерними элементами управления в Win32, не является поточно-ориентированным. Следовательно, ваша форма и дочерние элементы управления должны быть доступны только в том же потоке, в котором они созданы.

В вашем случае вам не следует создавать экземпляры TabPage с использованием потока BackgroundWorker или любого другого потока, кроме основного потока, в котором, как я полагаю, у вас есть основная форма, содержащая TabControl, в который вы добавляете страницы.

Часто разработчикам везет и им удается использовать элементы управления в разных потоках, для которых они были созданы, и это не дает сбоя. Но это всего лишь чистая удача, и рано или поздно она потерпит неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...