2016-01-19 3 views
-1

Я пытаюсь создать файл excel с помощью spreadsheetgear, а также Parallel.ForEach, для записи в ячейках, и иногда получаю исключение ссылочной ссылки. Есть ли какие-то настройки, которые мне нужно сделать, или настроить?Spreadsheetgear параллельно

ответ

4

Если вы намерены выполнять одновременную работу над одной книгой по нескольким потокам, каждый из ваших потоков должен получить/освободить блокировку через IWorkbookSet. GetLock() и ReleaseLock() на соответствующем IWorkbookSet при выполнении этой работы над книгой. В противном случае вы можете получить доступ к книге в непредвиденном состоянии, и могут возникнуть всевозможные, казалось бы, случайные исключения, подобные тем, которые вы видите. Пример:

// 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(); 
    } 
}); 

По крайней мере, для этого простого примера, такой подход не обеспечивает выигрыш в производительности, поскольку каждый поток должен ждать свою очередь, чтобы получить доступ к рабочей книге и добавить символ к листу. На самом деле этот подход, безусловно, ушивает производительности по сравнению с выполнением этой задачи в более линейном, многопоточном режиме.

Таким образом, в зависимости от специфики вашей задачи и объема работы, которую она делает в рабочей книге, и других вещей, которые могут быть успешно выполнены одновременно, такой подход может или не может обеспечить эффективность работы по сравнению с более линейным подходом ,

Смежные вопросы