в предложении;выделенный поток должен перезвонить потоку пользовательского интерфейса, которому принадлежит форма.Межпоточные операции пользовательского интерфейса недопустимы, поскольку существуют определенные операции, которые могут привести к отключению элемента управления пользовательского интерфейса от обработчика сообщений Windows.Это плохо, потому что тогда Windows не может сказать окну делать что-либо, включая рисование самого себя, перемещение или даже закрытие.Окно становится «мошенническим», и все, что Windows может сделать, это завершить весь процесс, который породил окно.
Вызов метода формы может быть синхронной или асинхронной операцией, но в любом случае его необходимо поставить в очередь.для выполнения потоком пользовательского интерфейса.
Вот способ сделать вызовы из фоновых потоков SEEM, как если бы они выполнялись фоновым потоком, без нарушения правил многопоточности:
//in your form class
public new void Show()
{
if(!InvokeRequired)
base.Show();
else
this.Invoke((MethodInvoker)(()=>base.Show()));
}
Поймите, что вы не можете иметь дело с формой как с базовым классом System.Windows.Form;это должен быть конкретный класс формы, который вы создаете.В противном случае скрытие метода игнорируется, и базовая реализация используется по умолчанию.
Настраивая его таким образом, всякий раз, когда действие может быть запущено из фонового потока, вы избегаете операций многопоточности.При желании вы можете изменить этот метод для асинхронного запуска, вызвав BeginInvoke () для элемента управления вместо Invoke (), но поскольку вызов Show () обычно выполняется синхронно, я бы придерживался Invoke.