并联电子表格装置

Geo*_*scu -2 c# spreadsheetgear async-await

我正在尝试使用电子表格工具和 Parallel.ForEach 生成一个 excel 文件,用于在单元格中写入,有时会出现空引用异常。我需要做任何设置或配置吗?

Tim*_*sen 5

如果您打算跨多个线程对同一工作簿同时进行工作,则每个线程都必须通过 IWorkbookSet 获取/释放锁。在工作簿上执行此工作时,会在相应的IWorkbookSet上使用GetLock () 和ReleaseLock () 。否则,您可能会在意外状态下访问工作簿,并且可能会发生您所看到的各种看似随机的异常。例子:

// Create a new "workbook set".
IWorkbookSet wbs = Factory.GetWorkbookSet();

// Add a workbook under this "workbook set".
IWorkbook workbook = wbs.Workbooks.Add();
IWorksheet worksheet = workbook.ActiveWorksheet;

// Do your task (here I just insert single characters into cells in the sheet).
Parallel.ForEach("ABCDEFG", (char c) => {
    // Must acquire a workbook set lock before doing anything to the workbook!
    wbs.GetLock();
    try
    {
        // Get next row to add character.
        int nextRow = worksheet.UsedRange.Row + worksheet.UsedRange.RowCount;

        // Add character to cell.
        worksheet.Cells[nextRow, 0].Value = c;
    }
    finally
    {
        // Must release the workbook set lock.
        wbs.ReleaseLock();
    }
});
Run Code Online (Sandbox Code Playgroud)

至少对于这个简单的示例,这种方法没有提供任何性能优势,因为每个线程必须等待轮到访问工作簿并将字符添加到工作表中。事实上,与以更线性、非多线程的方式执行此任务相比, 这种方法肯定会损害性能。

因此,根据任务的具体情况以及它在工作簿上完成的工作量与其他可以更成功地同时完成的事情的工作量,与更线性的方法相比,这种方法可能会也可能不会提供性能优势。