Я думаю, что ваша проблема с этой мыслью: «открыть форму в отдельном потоке с именем« поток пользовательского интерфейса »»
То, как работает Windows, выглядит следующим образом (обратите внимание, Vista может изменить некоторые из этих реалий):
Существует один важный поток, который называется " Main Thread " или " UI Thread ". Эта нить обрабатывает оконных сообщений , например, "эй, щелкнула мышкой по этому пикселю."
Эти сообщения попадают в очередь, и главный поток обрабатывает их , когда он не занят чем-то другим .
Таким образом, если вы выполняете вызов функции foo () в главном потоке, если это занимает много времени, сообщения Windows не обрабатываются в течение этого времени, и поэтому взаимодействие с пользователем не может происходить.
Основной поток также рисует пользовательский интерфейс на экране, поэтому длительное выполнение функции foo () также остановит рисование вашего приложения.
Все остальные потоки, кроме этого священного и специального основного потока, являются рабочими потоками. Эти рабочие потоки могут что-то делать, но они никогда не могут напрямую взаимодействовать с пользовательским интерфейсом.
Эта реальность вызывает две проблемы:
ПОЛУЧЕНИЕ ОСНОВНОЙ РЕЗЬБЫ: Поскольку вы не хотите, чтобы долго выполняющаяся функция foo () прекращала все взаимодействие с пользователем, вам необходимо отправить эту работу в рабочий поток.
ПОЛУЧЕНИЕ ВЕРНУТЬСЯ В ГЛАВНУЮ РЕЗЬБУ: Когда завершается долго выполняющаяся функция foo (), вы, вероятно, захотите уведомить пользователя, сделав что-то в пользовательском интерфейсе, но вы не можете сделать это в рабочем потоке, поэтому вам нужно «вернуться» к основному потоку.
Так что я считаю, что ваша проблема в вышеприведенной программе очень общая: сама ваша цель неверна, потому что не предполагается, что можно вызвать _form.Show () в каком-либо потоке, кроме священного основного потока.