SpreadSheetGear从多个单元格中读取IWorksheet单元格抛出异常

时间:2017-08-20 11:49:59

标签: c# spreadsheetgear

我正在尝试从SpreadSheetGear IworkBook中读取单元格,它正在变得异常。是预期的吗?

    for (int i = wr; j <= er; i++) {
    for (int j = sc; j <= ec; j++)
                      {

                          var rng = worksheet.Range[i, j];
                          var cellData = GetCell(rng, worksheet);
                          row.c.Add(cellData.Index, cellData);
                      }
                      }

                      void GetCell (SpreadsheetGear.IRange rng,SpreadsheetGear.IWorksheet worksheet) {
                      // CPU bound task

                       if (rng.Locked)
                    {
                        var locked = 1;
                    }
                      }


===================

Parllelism Code
Parallel.For (sr ,er+1 ,i =>
{
for (int j = sc; j <= ec; j++)
                  {

                      var rng = worksheet.Range[i, j];
                      var cellData = GetCell(rng, worksheet);
                      row.c.Add(cellData.Index, cellData);
                  }
                  }

                  void GetCell (SpreadsheetGear.IRange rng,SpreadsheetGear.IWorksheet worksheet) {
                  // CPU bound task

                   if (rng.Locked)
                {
                    var locked = 1;
                }
                  }

我正在尝试并行化CPU绑定任务但是当我尝试在块下面抛出异常时抛出异常

 if (rng.Locked)
                    {
                        var locked = 1;
                    }
                      }

1 个答案:

答案 0 :(得分:1)

预计会出现这种情况的例外情况,因为您无法在工作簿上并行化此类工作。对于并行代码,多个线程同时访问工作簿,这是不受支持的,因此最终导致一些意外/错误的内部状态,最终导致您看到的异常。

SpreadsheetGear确实支持从多个线程访问工作簿,但这有一个很大的警告:每个线程必须在调用IWorkbookSet之间完成工作。GetLock()/ ReleaseLock(),这保证了在任何给定时间只有一个线程将访问工作簿。因此,对于并行化工作的任务,此API对您没有好处,因为使用GetLock()/ ReleaseLock()可以有效地将并行任务恢复为串行任务。最重要的是,没有办法用SpreadsheetGear安全地并行化这类任务。