c# - System.Threading.Tasks.Parallel.For 与 Openxml 出现意外结果

标签 c# multithreading openxml

我正在使用以下代码

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 文件中创建了行,但某些行未创建,并且在打开时显示警告。我知道,sheetData 对象在以下情况下被锁定:其他线程尝试将行插入到sheetData对象中。我该如何解决这个问题。

最佳答案

这些 Excel 对象并非设计为同时从多个线程访问。鉴于您在此循环中执行的唯一特别“昂贵”的任务是必须序列化的任务,因此最好的选择是在一个线程中的常规 for 循环中简单地完成整个任务。

如果实际上计算每个单元格的值很昂贵,那么您可能考虑使用并行循环来简单地生成每个单元格的内容,将它们放入内存中的某个中间存储位置,然后复制从单个线程将这些值传输到 Excel,但由于此循环似乎没有进行任何如此昂贵的计算,因此此处无需执行此操作。

关于c# - System.Threading.Tasks.Parallel.For 与 Openxml 出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22327645/

相关文章:

c# - 有没有办法强制 Microsoft.Jet.OLEDB 从 Excel 中获取 MM/DD/YYYY 格式的日期列?

c# - Networkstream不规则速度

java - 是否可以在一次调用中调用 Thread start() 和 join() ?

xml - 默认 WordML 单位度量?像素或点或英寸

c# - 打印时将行设置为在顶部重复 - 打开 XML 和 Excel

c# - Linux 中的 Visual Studio Code - 将 F5(调试)从 "dotnet build"重新映射到 "msbuild csproj"?

c# - Azure 数据湖与数据工厂自定义事件的连接

c++ - Linux 线程傻瓜。有人可以解释一下 linux 中多线程库之间的区别吗?

java - 一个 servlet 容器中的多个 Singleton(Tomcat)

ms-word - 这是正确的 Open Office XML 吗?