我正在尝试从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;
}
}
答案 0 :(得分:1)
预计会出现这种情况的例外情况,因为您无法在工作簿上并行化此类工作。对于并行代码,多个线程同时访问工作簿,这是不受支持的,因此最终导致一些意外/错误的内部状态,最终导致您看到的异常。
SpreadsheetGear确实支持从多个线程访问工作簿,但这有一个很大的警告:每个线程必须在调用IWorkbookSet之间完成工作。GetLock()/ ReleaseLock(),这保证了在任何给定时间只有一个线程将访问工作簿。因此,对于并行化工作的任务,此API对您没有好处,因为使用GetLock()/ ReleaseLock()可以有效地将并行任务恢复为串行任务。最重要的是,没有办法用SpreadsheetGear安全地并行化这类任务。