Ответ 1
Метод TabControl AddTabPage
(тот, который вызывается при создании дескриптора) вызывает метод AddNativeTabPage
. Это, в свою очередь, вызывает SendMessage
и PostMessage
(эффективно, Control.Invoke
и Control.BeginInvoke
) для добавления закладки. Эти методы маршалируют добавление закладки на поток пользовательского интерфейса, поэтому элемент управления внутренне подчиняется правило, с которым вы не должны взаимодействовать с элементами управления пользовательского интерфейса от фоновый поток.
Это на самом деле означает, что если дескриптор создан, AddTabPage
безопасен для вызова из потоков, отличных от UI (очень необычный для элемента управления пользовательского интерфейса!). К сожалению, это также означает, что метод AddTabPage
блокирует, если TabControl еще не имеет дескриптора, потому что не будет сообщений о потоке потока пользовательского интерфейса, и поэтому его нельзя вызывать, если не создан дескриптор.
Для любопытных это находится в классе TabControl.ControlsCollection
в методе Add
.