これは、ここでの私の質問のさらに進んだものです
いくつかの読書をすることによって....私はセマフォからスレッドプールに移動しました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ThreadPoolTest
{
class Data
{
public int Pos { get; set; }
public int Num { get; set; }
}
class Program
{
static ManualResetEvent[] resetEvents = new ManualResetEvent[20];
static void Main(string[] args)
{
int s = 0;
for (int i = 0; i < 100000; i++)
{
resetEvents[s] = new ManualResetEvent(false);
Data d = new Data();
d.Pos = s;
d.Num = i;
ThreadPool.QueueUserWorkItem(new WaitCallback(Process), (object)d);
if (s >= 19)
{
WaitHandle.WaitAll(resetEvents);
Console.WriteLine("Press Enter to Move forward");
Console.ReadLine();
s = 0;
}
else
{
s = s + 1;
}
}
}
private static void Process(object o)
{
Data d = (Data) o;
Console.WriteLine(d.Num.ToString());
Thread.Sleep(10000);
resetEvents[d.Pos].Set();
}
}
}
このコードは機能し、20個のセットで処理できます。しかし、WaitAllのため、このコードは好きではありません。たとえば、20のバッチを開始し、17が終了するまでに、3つのスレッドに時間がかかるとします。それでも、WaitAllがあるため、17個のスレッドを待機状態のままにします。
WaitAnyは良かったでしょう...しかし、プールを効率的に使用するために、スタック、リスト、キューなどの多くの制御構造を構築する必要があるのはかなり厄介なようです。
私が気に入らないもう1つの点は、resetEventsのクラス内のグローバル変数全体です。この配列は、Processメソッドとメインループの間で共有する必要があるためです。
上記のコードは機能します...しかし、私はそれを改善するためにあなたの助けが必要です。
繰り返しますが...私は.NET2.0VS2008を使用しています。.NET4.0並列/非同期フレームワークを使用できません。