我将我的线程创建为
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();
}使用threadCount(= 100,150,255等...)但是我不知道有多少线程在工作。在执行时。
我想控制所有线程何时完成它们的工作。然后给我一条消息,比如“所有线程都已死,作业已完成...”比如backgroundWorker的RunWorkerCompleted事件
发布于 2010-08-27 20:19:42
确定所有线程何时完成很简单。
for (int i = 0; i < threadCount; i++)
{
threads[i].Join();
}
Console.WriteLine("All threads are done!");你能详细说明一下你的其他要求吗?
发布于 2010-08-27 20:19:50
您可以检查线程的ThreadState属性。
使用异步方法可能更好。这将为您提供一个WaitHandle对象,您可以使用WaitHandle.WaitAll等待所有异步方法完成。
下面是对异步编程的介绍:http://msdn.microsoft.com/en-us/library/aa719598%28v=VS.71%29.aspx
发布于 2010-08-27 21:10:15
首先,我必须指出创建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。
CountdownEvent将一直等待,直到其内部计数为零。如果您希望使用ThreadPool,则此方法更适合。如果你没有使用.NET 4.0,你可以在Joe Albahari's website上得到一个非常简单的实现。
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();https://stackoverflow.com/questions/3583979
复制相似问题