【发布时间】:2013-01-07 00:39:20
【问题描述】:
我必须对 10,000 多个 Excel 文件应用简单的格式。我已经有一个多核程序正在运行。它为每个 Excel 文件打开一个新的 Excel 实例。如果重要的话,这段代码目前在我的表单代码中。
我希望将一个 Excel 实例与许多工作簿一起使用。如果我只使用一个 Excel 实例,是否可以使用多核功能?如何?
-如果上面的答案是否定的,一个更复杂的问题可能是:我应该生成多少个 Excel 实例,以及如何在每个实例之间拆分工作簿?
这里的当前代码:
private void SelectFilesButtonClick(object sender, EventArgs e)
{
var listOfExcelFiles = OpenExcel.FileNames.ToList();
Parallel.ForEach(listOfExcelFiles, TrivialExcelEditFunction);
}
private void TrivialExcelEditFunction(string file)
{
//Open instance of Excel
//Do processing
//Close instance of Excel
}
更新了下面的代码,但仍然没有将自身限制为正确的内核数量。不知道为什么。
private void SelectFilesButtonClick(object sender, EventArgs e)
{
var listOfExcelFiles = OpenExcel.FileNames.ToList();
int cores = Environment.ProcessorCount;
//Split one list into list of lists. Number of lists based on number of cpu cores
List<List<object>> listOfLists = Split(listOfExcelFiles, cores);
//Limits number of threads to number of cores
Parallel.ForEach(listOfLists, new ParallelOptions { MaxDegreeOfParallelism = cores }, EditExcel);
}
private void TrivialExcelEditFunction(string file)
{
//Open instance of Excel
foreach (string file in files)
{
//Do processing
}
//Close instance of Excel
}
假设我有 4 个核心。我的想法是将文件列表分成 4 个相等的列表,将线程限制为 4 个,然后我就可以在 4 个 Excel 实例中处理文件。我认为这意味着 TrivialExcelEditFunction 只会运行 4 次。相反,这个函数运行了 14 到 27 次。请告诉我哪里出错了。
【问题讨论】: