【问题标题】:SpreadSheetGear IWorksheet cells reading from multiple cells throwing exception从多个单元格读取的 SpreadSheetGear IWorksheet 单元格抛出异常
【发布时间】:2017-08-21 02:45:23
【问题描述】:

我正在尝试从 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;
                    }
                      }

【问题讨论】:

  • 您需要提供更具体的信息才能获得任何有用的反馈。请提供有关所涉及代码的更多详细信息、单元格值或这些单元格的其他相关信息、您遇到的异常等。
  • 我用完整的细节编辑了我的问题。请看一下

标签: c# spreadsheetgear


【解决方案1】:

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

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

【讨论】:

  • 我只是想从 IRange(单元格属性)读取 Irange 也不支持多次读取?如果是这种情况,请克隆 IRange 对象并从克隆的对象中读取属性。有可能吗?
  • 我不确定您所说的 IRange 上的“多次读取”是什么意思,您能详细说明一下吗?
  • 对不起,没有多次阅读。只是我想从 IRange 读取属性。一次从多个线程读取也不支持?如果是这种情况,请克隆 IRange 对象并从克隆的对象中读取属性。有可能吗?
  • 除非您使用 GetLock() 和 ReleaseLock(),否则任何类型的多线程访问(读或写)都是不可能的,如前所述,就性能而言,这对您没有好处任务。你不能克隆一个 IRange,但把它放在一边,即使你可以这样做也对你没有好处,因为两个 IRange 对象仍然是同一基础工作簿(更具体地说是 IWorkbookSet 对象)的一部分,无法访问多个线程同时进行。
猜你喜欢
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2011-07-29
相关资源
最近更新 更多