在Openxml中使用System.Threading.Tasks.Parallel.For出现意外结果

本文关键字:For Parallel 结果 意外 Tasks Threading Openxml System | 更新日期: 2023-09-27 17:49:26

我使用以下代码

SheetData sheetdata = worksheet.Worksheet.GetFirstChild<SheetData>();
System.Threading.Tasks.Parallel.For((excelStartRow + 1), (endRowvalue + 1),
  (i) =>
  {
      Row contentRow = new Row();
      //do something
      Cell content = createTextCell(
          dtspSheetData.Tables[0].Columns.IndexOf(column) + excelStartColumn, i,
          dtspSheetData.Tables[0].Rows[j][column.ColumnName],
          formatCount, 1, cellFormatCount);
      contentRow.AppendChild(content);
      sheetData.AppendChild(contentRow);
  });

我试图在使用OpenXML创建Excel时实现并行性。问题是行是在Excel文件中创建的,但有些行没有被创建,并在打开while时显示警告。我理解,当其他线程试图将行插入到sheetData对象时,sheetData对象被锁定。如何解决这个问题?

在Openxml中使用System.Threading.Tasks.Parallel.For出现意外结果

这些Excel对象不是设计为多线程同时访问的。考虑到在这个循环中执行的唯一特别"昂贵"的任务是必须序列化的任务,最好的办法是在一个线程中,在常规的for循环中完成整个任务。

如果实际计算每个单元格的值是昂贵的,那么你可以潜在地考虑一个并行循环来简单地生成每个单元格的内容,将它们放入内存中的一些中间存储位置,然后从单个线程将这些值复制到Excel中,但由于这个循环似乎没有做任何这样昂贵的计算,这里没有必要这样做。