我有以下(简化)控制台应用程序:
DirectoryInfo d = new DirectoryInfo(@"D:\Test");
FileInfo[] Files = d.GetFiles("*.txt");
foreach(FileInfo file in Files )
{
//Do Something
}
文件夹中有200多个文件。每个文件的处理大约需要15分钟。
我的问题是,我是否可以使用并发/并行编程来处理多个文件?
我想的是,开始一些线程?并且每个人都将处理文件列表中每隔5个左右的文件。
所有文件处理都是完全独立的,因此没有竞争条件的风险。
如果可以,我可以启动多少个线程或其他任何限制。
将要完成的工作是将每个文件的内容加载到通用列表中,对其进行处理并多次遍历列表
答案 0 :(得分:3)
Parallel.ForEach
似乎表现不错。它将为您提供真正的并行化,因为它可以将每次迭代计划到不同的CPU核心。
如果可以,我可以开始的线程数有限制, 或任何其他限制。
我不会产生数百个线程来执行这项工作,因为处理大量线程可能会花费更多时间,因为你的CPU和磁盘太忙了。
答案 1 :(得分:1)
Task based approach can be a solution, control your task based on available
resources.
DirectoryInfo d = new DirectoryInfo(@"D:\Test");
FileInfo[] Files = d.GetFiles("*.txt");
foreach (FileInfo file in Files)
{
//Check items in ConcurrentDictionary, if exceeds the limit -
//wait here
Task t = Task.Factory.StartNew((Object o) =>
{
//Do your work
}, file);
//Add items in ConcurrentDictionary;
}