Во-первых, я должен отметить, что создание потоков 100, 150, 255 и т. Д., Вероятно, не очень хорошая идея.Возможно, вам лучше использовать класс ThreadPool
или Task
(если вы используете .NET 4.0).Кроме того, есть два хорошо известных метода ожидания завершения всех потоков.
Присоединение к потоку.
Thread.Join
блокирует до завершения целевого потока.
for (int i = 0; i < threadCount; i++)
{
Searcher src = new Searcher(i, this);
threads[i] = new Thread(new ThreadStart(src.getIpRange));
threads[i].Name = string.Format(i.ToString());
}
foreach (Thread t in threads)
{
t.Start();
}
foreach (Thread t in threads)
{
t.Join();
}
Использование CountdownEvent.
A CountdownEvent ожидает, пока его внутренний счетчик не достигнет нуля.Этот метод лучше подходит, если вы хотите использовать ThreadPool
.Если вы не используете .NET 4.0, вы можете получить действительно простую реализацию на сайте Джо Албахари .
var finished = new CountdownEvent(1);
for (int i = 0; i < threadCount; i++)
{
finished.AddCount();
Searcher src = new Searcher(i, this);
threads[i] = new Thread(
() =>
{
try
{
src.getIpRange();
}
finally
{
finished.Signal();
}
}
threads[i].Name = string.Format(i.ToString());
}
foreach (Thread t in threads)
{
t.Start();
}
finished.Signal();
finished.WaitOne();