我正在尝试按如下方式简化问题,
现在我的问题是我想确保一次只生成5个线程,因为开始100 +线程根本不是好主意。
所以请告诉我应该使用什么方法来确保只有5个线程正在工作,只要其中一个线程完成,就可以启动新线程。
全心全意,
答案 0 :(得分:4)
答案 1 :(得分:4)
我投票支持task parallel library / Rx(包含在.NET 4.0中,但可以下载3.5版):
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 5;
Parallel.ForEach(GetListOFiles(), options, (file) =>
{
DoStuffWithFile(file);
});
请注意,这将使用最多5个线程,但我看到它使用较少。
答案 2 :(得分:2)
将文件列表拆分为5个相同大小的列表。然后启动五个线程,并通过ParameterizedThreadStart
传递每个单独的较小列表。
但是,由于工作几乎完全受I / O限制,因此该过程不太可能受益于线程。
答案 3 :(得分:2)
虽然这可能不会直接回答您的问题,但似乎producer-consumer design符合您的需求。此外,this可能有所帮助。
答案 4 :(得分:2)
我通常采用这种方法:
声明一个共享整数变量来表示工作线程的数量。 将作业分配给线程(只是将作业排入ThreadPool)时,请增加该值。当线程完成作业时,请减小该值。
确保整数值的递减或递增为原子。
在作业调度程序中,仅在工作线程数小于最大值时才获取作业并分配给线程。否则,等待信号(将由完成作业的工作线程触发)。如果您希望事件更简单,请让调度程序执行空循环以等待。
好处是最大值是可配置的,它利用了内置的ThreadPool的优势。编写消费者/生产者模型来解决这么小的问题是很昂贵的。
答案 5 :(得分:1)
通过ThreadPool进行处理,然后使用setMaxThreads
http://msdn.microsoft.com/en-us/library/system.threading.threadpool.setmaxthreads.aspx