Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在一个Excel实例中使用多核?_C#_Excel_Multicore - Fatal编程技术网

C# 是否可以在一个Excel实例中使用多核?

C# 是否可以在一个Excel实例中使用多核?,c#,excel,multicore,C#,Excel,Multicore,我必须对10000多个Excel文件应用简单的格式设置。我已经有了一个多核程序。它会为每个Excel文件打开一个新的Excel实例。如果重要的话,此代码当前在我的表单代码中 我希望使用一个Excel实例和许多工作簿。如果我只使用一个Excel实例,是否可以使用多核功能?怎么做 -如果上面的答案是否定的,那么更复杂的问题可能是:我应该生成多少个Excel实例,如何在每个实例之间拆分工作簿 此处的当前代码: private void SelectFilesButtonClick(object sen

我必须对10000多个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
}
private void选择文件按钮单击(对象发送方,事件参数e)
{
var listOfExcelFiles=OpenExcel.FileNames.ToList();
int cores=Environment.ProcessorCount;
//将一个列表拆分为列表列表。基于cpu核心数的列表数
List listOfLists=拆分(LISTOFEXELFILES,核心);
//将线程数限制为内核数
ForEach(列表,新的并行选项{MaxDegreeOfParallelism=cores},EditExcel);
}
私有函数(字符串文件)
{
//Excel的开放实例
foreach(文件中的字符串文件)
{
//处理
}
//关闭Excel实例
}

假设我有4个核。我的想法是将文件列表分成4个相等的列表,将线程限制为4个,然后我就能够在4个Excel实例中处理文件。我认为这意味着这个函数只能运行4次。相反,此函数在任何地方运行14到27次。请告诉我哪里出错。

创建N个任务/线程来进行处理,其中“N”是您机器上的内核数。为每个任务/线程提供一个
Excel
实例


您将无法从多个线程控制一个实例(至少不是有效的;一次只能处理一个线程的任务),并且创建如此多的Excel实例是非常低效的。

我认为这就是@Servy上面提到的。目前,我每天都在使用一段代码来处理Excel,而且肯定还没有失败。还要确保正确封送COM对象。 还有一点额外的信息,Excel2010内部使用多核,注意性能(尤其是大文件)

var tasks=新任务[Environment.ProcessorCount];
for(int i=0;i
{
//您的Excel代码在这里。
});
}
Task.WaitAll(任务);

正如@Servy所指出的,您可以使用每个线程一个Excel实例创建多个线程

确保每个线程都创建了它所使用的Excel对象

期待怪异。对于10000多个文件,您可能至少在几天内会遇到一些小问题。如果隐藏的Excel实例试图提示用户,则可能会显示为冻结

Word在使用一些调用单线程COM对象的函数时出现了一些问题,我怀疑Excel可能也有一些问题。换句话说,这些表现形式多种多样,包括实例冻结或关闭


如果格式化非常简单,并且您的文件是xmlx,那么可以编写一些代码通过OOXML SDK应用更改,这不需要实际的Excel实例

我应该为每个物理核心还是每个逻辑核心创建一个实例?@Brandon最有可能是逻辑的,但在实践中,两种方法都试一下,看看哪个更快。用新代码更新问题。还是不走运。你有没有可能提供更多的帮助?@Brandon只需删除你用来启动新实例的代码。创建N个线程/任务,在每个线程/任务中创建一个excel实例。让该线程处理1/N个文件。等待所有线程/任务。不要使用
Parallel.Foreach
。工作正常。无需重复打开和关闭Excel的开销,我将处理时间从每3秒1个文件减少到每秒5个文件。似乎在批处理时处理错误最合理的方法是存储遇到错误的文件,并通知用户需要手动处理哪些文件。@Brandon这是最好的方法,是的,除非你需要一个看门狗线程来检测你的一些工作线程是否被冻结。当您不适当地关闭COM对象时,将导致严重的内存泄漏
var tasks = new Task[Environment.ProcessorCount];

for (int i = 0; i< Environment.ProcessorCount; i++)
{
    tasks [i] = Task.Factory.StartNew(() =>
    {
        // your Excel code here.                 
    });
}

Task.WaitAll(tasks);