0

したがって、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 スレッドをブロックしていません。

4

1 に答える 1