Большинство людей видят эту ошибку и видят одну вещь: «вы не обращаетесь к этому элементу управления из основного потока пользовательского интерфейса». В действительности вы можете иметь 100 потоков пользовательского интерфейса, если хотите (поведение для этого не определено, но поддерживается). Скорее всего, PanelMain создается в другом потоке (this); Я не вижу код - но похоже, что вы создаете его в своем рабочем / потоке.
Чтобы подтвердить поведение, попробуйте это:
Action addAction = new Action (
new delegate { panelMain.Controls.Add(UCLoadingScreen); } )
if(panelMain.InvokeRequired)
{
panelMain.Invoke(addAction); // Breakpoint here.
}
else
{
addAction();
}
Будьте готовы к другой ошибке (дочерний элемент управления в потоке, отличном от родительского, не уверен, какую ошибку вы получите, но я уверен, что вы это сделаете). Это не исправление.
Фабрика исправит это однако:
public void CreateControl<T>() where T : new()
{
if(InvokeRequired)
{
return (T)Invoke(new Func<T>(CreateControl<T>()));
}
return new T();
}
РЕДАКТИРОВАТЬ: panelMain может не быть нарушителем потока, как я уже говорил, родительские элементы управления из разных потоков приводят к крайне неопределенному поведению. Убедитесь, что все ваши элементы управления созданы в контексте потока вашей основной формы.