глядя на код, вы создаете два экземпляра Form2, при попытке закрыть вы создаете новый экземпляр.
Еще один момент, даже если у вас есть только один экземпляр, вы создаете форму в главном потоке и пытаетесь закрыть ее в другом рабочем потоке, вы получите исключение кросс-потока.
Дайте мне знать, что именно является вашим требованием. Как упоминалось ранее в этом посте, разрешать рабочим потокам доступ к элементам пользовательского интерфейса не очень хорошая идея
Это то, что я бы сделал
private void button1_Click (отправитель объекта, EventArgs e)
{
ThreadStart myThreadDelegate = новый ThreadStart (RunExitForm2);
Thread MyThread = new Thread(myThreadDelegate);
MyThread.Start();
f2.ShowDialog(Application.OpenForms[0]);
}
private void RunExitForm2()
{
Thread.Sleep(10000);
test t = new test(f2.CloseForm2);
if (InvokeRequired)
{
BeginInvoke( t);
return;
}
}
Здесь test является делегатом метода Closeform2, определенного в Form2, в котором я просто закрываю форму