Если ваш пользовательский элемент управления не сразу виден после его создания, дескриптор не будет создан в потоке, в котором вы думаете, что он создан. Это не объект C #, для которого важен родительский поток, а объект Windows Handle, родитель которого важен.
Чтобы немедленно создать элемент управления в потоке, в котором, как вы думали, вы его создали, затем
прочитайте control.Handle
, который заставит управление фактически быть выполненным, и назначьте дескриптор.
MyUserControl uc = new MyUserControl(); // the handle is not created here
uc.Visible = false;
IntPtr dummy = uc.Handle; // The control is immediately given a real handle
Вы также можете попытаться поиграться с uc.CreateControl, но это не создаст дескриптор, если элемент управления не виден.
Теперь вы можете иметь другой поток для обновления вашего пользовательского элемента управления, даже если пользовательский элемент управления не отображается.
uc.BeginInvoke((Action)(() => uc.Text = "ha ha"));
Если вы пропустите строку dummy = uc.Handle
, вы получите исключение, что вы не можете вызвать BeginInvoke для элемента управления, у которого нет дескриптора.
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.createcontrol(v=vs.90).aspx