Хотя я не на 100% осведомлен обо всем, что говорит, что запуск полностью отдельных форм, выполнение полностью изолированных операций в их собственных потоках опасно в любом случае, выполнение всех операций пользовательского интерфейса в одном потоке обычно считается хорошей практикой.
Вы можете поддержать это, просто используя свой класс Subform, использующий BackgroundWorker.Когда форма отобразится, запустите BackgroundWorker, чтобы он обрабатывал все, что вам нужно.
Затем вы можете просто создать новые экземпляры вашей Subform в потоке GUI и показать их.Форма покажет и начнет свою работу в другом потоке.
Таким образом, пользовательский интерфейс будет работать в потоке графического интерфейса, но операции, выполняемые в формах, будут выполняться в потоках ThreadPool.
Обновление
Вот пример того, как могут выглядеть ваши фоновые обработчики - обратите внимание, что (как обычно) это просто не в моей голове, но я думаю, вы можете получить свою головувокруг основных принципов.
Добавьте BackgroundWorker в форму с именем worker.Подключите его к следующим обработчикам событий:
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Executed on GUI thread.
if (e.Error != null)
{
// Background thread errored - report it in a messagebox.
MessageBox.Show(e.Error.ToString());
return;
}
// Worker succeeded.
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Executed on GUI thread.
progressBar1.Value = e.ProgressPercentage;
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
// Executed on ThreadPool thread.
int max = (int)e.Argument;
for (long i = 0; i < max; i++)
{
worker.ReportProgress(Convert.ToInt32(i));
}
}
Ваш обработчик кликов будет выглядеть примерно так:
void button1_Click(object sender, EventArgs e)
{
int max;
try
{
// This is what you have in your click handler,
// Int32.TryParse is a much better alternative.
max = Convert.ToInt32(textBox1.Text);
}
catch
{
MessageBox.Show("Enter numbers", "ERROR");
return;
}
progressBar1.Maximum = max;
worker.RunWorkerAsync(max);
}
Надеюсь, это поможет.