因此,根据MSDN和我读过的许多其他地方,他们使用信号量并在各个线程中阻塞,如下所示:
private static Semaphore _pool;
public static void Main()
{
_pool = new Semaphore(0, 3);
for(int i = 1; i <= 1000; i++)
{
Thread t = new Thread(new ParameterizedThreadStart(Worker));
t.Start(i);
}
}
private static void Worker(object num)
{
try
{
_pool.WaitOne();
// do a long process here
}
finally
{
_pool.Release();
}
}
根据 Main() 中的迭代次数,阻止进程以便您不会一次创建潜在的 1000 个线程不是更有意义吗?例如:
private static Semaphore _pool;
public static void Main()
{
_pool = new Semaphore(0, 3);
for(int i = 1; i <= 1000; i++)
{
_pool.WaitOne(); // wait for semaphore release here
Thread t = new Thread(new ParameterizedThreadStart(Worker));
t.Start(i);
}
}
private static void Worker(object num)
{
try
{
// do a long process here
}
finally
{
_pool.Release();
}
}
也许两种方式都没有错,这取决于情况?或者一旦有很多迭代,有更好的方法来做到这一点?
编辑:这是一个 Windows 服务,所以我没有阻塞 UI 线程。