@francis_schuster
В .NET есть несколько способов дождаться завершения всех потоков в программе. Вот некоторые из них:
- Использование метода Join() для каждого потока:
Метод Join() блокирует вызывающий поток до тех пор, пока поток, для которого он вызывается, не завершится.
Пример:
Thread thread1 = new Thread(Method1);
Thread thread2 = new Thread(Method2);
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
- Использование класса ManualResetEvent:
ManualResetEvent предоставляет возможность блокировки выполнения потока до тех пор, пока не будет вызван сигнал на разблокировку.
Пример:
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
Thread thread1 = new Thread(Method1);
Thread thread2 = new Thread(Method2);
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
manualResetEvent.WaitOne();
- Использование класса CountdownEvent:
CountdownEvent предоставляет возможность ожидания завершения заданного количества сигналов.
Пример:
CountdownEvent countdownEvent = new CountdownEvent(2);
Thread thread1 = new Thread(() =>
{
Method1();
countdownEvent.Signal();
});
Thread thread2 = new Thread(() =>
{
Method2();
countdownEvent.Signal();
});
thread1.Start();
thread2.Start();
countdownEvent.Wait();
- Использование класса Task:
Task представляет асинхронную операцию и может быть использован для дожидания завершения нескольких потоков.
Пример:
Task task1 = Task.Run(() => Method1());
Task task2 = Task.Run(() => Method2());
Task.WaitAll(task1, task2);
Выбор подходящего метода зависит от конкретных требований и ограничений вашей программы.