РЕДАКТИРОВАТЬ: Хорошо, теперь у нас есть больше информации и мы знаем, что вопрос не действительно о пользовательском интерфейсе, это просто:
List<Task> listOfTasks = GetListOfTasks()
List<Thread> threads = new List<Thread>();
foreach(Task task in Tasks)
{
DoSomeWork work = new DoSomeWork(task);
Thread workerThread = new Thread(work.CompleteTask);
workerThread.Start();
threads.Add(workerThread);
}
// Now all the threads have started, Join on them in turn to wait
// for them to finish. DON'T DO THIS IN A UI THREAD IN A NORMAL APP.
foreach (Thread thread in threads)
{
thread.Join();
}
Конечно, использование TPL WaitForAll
является лучшей идеей, чем эта - если вы можете ее использовать, сделайте это. Но если вы используете простые потоки, Join
хорошо.
РЕДАКТИРОВАТЬ: я предполагаю, что вы пишете приложение Windows Forms, основанное на методе Form1_Load. Было бы полезно, если бы вы могли дать больше контекста в вопросе.
Что ж, ваши потоки вряд ли будут завершены сразу же после того, как вы их запустили ... и вам не следует блокировать поток пользовательского интерфейса , ожидающий их завершения, поскольку ваш пользовательский интерфейс зависнет .
Вместо этого вы должны сделать каждый вызов задачи DoSomeWork
обратно в пользовательский интерфейс после его завершения. Либо DoSomeWork
может иметь событие, к которому вы можете добавить обработчик, либо вы можете передать делегат обработчика завершения в конструктор, или, возможно, он знает о форме напрямую и может сам отозвать ее - это зависит от того, что он делает на самом деле.
В любом случае, когда задача успешно завершена, вы можете отправить сообщение обратно в поток пользовательского интерфейса, используя Control.BeginInvoke
. Форма может отслеживать количество выполненных задач, поэтому, если ей нужно что-то сделать, когда все завершено, она может сделать это.
Если это не поможет, пожалуйста, дайте больше информации о том, что вы хотите сделать, когда все задачи завершены, и что эти задачи делают.