したがって、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() の反復回数に応じて、潜在的に数千のスレッドを一度に作成しないように、プロセスをブロックする方が理にかなっていると思いませんか? 例えば:
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 スレッドをブロックしていません。