这是我的问题here
通过阅读……我从信号量转移到了线程池。
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 个线程,3 个线程需要更长的时间,而 17 个线程已经完成。即使那样,由于 WaitAll 的原因,我仍将保持 17 个线程处于等待状态。
WaitAny 本来会很好……但是我必须构建很多控制结构(如堆栈、列表、队列等)才能有效地使用池,这似乎很麻烦。
我不喜欢的另一件事是 resetEvents 类中的整个全局变量。因为这个数组必须在 Process 方法和主循环之间共享。
上面的代码有效......但我需要你的帮助来改进它。
再次...我在 .NET 2.0 VS 2008 上。我不能使用 .NET 4.0 并行/异步框架。