终止excel过程
在阅读了关于在引用excel com对象时不使用双点的许multithreading之后,我决定实现它。
直到我循环完成之后,它才开始工作。
这是我的循环。 请注意,如果我发表评论,它的作品:
for (int i = 1; i < dgv.Columns.Count + 1; i++) { excelWorkbook.Cells[1, i] = dgv.Columns[i - 1].HeaderText; var cell = excelWorkbook.Cells[1, i]; var fontSetter = cell.Font; fontSetter.Bold = true; //Bolds the header row // Garbage collecting GC.Collect(); GC.WaitForPendingFinalizers(); Marshal.FinalReleaseComObject(fontSetter); Marshal.FinalReleaseComObject(cell); }
我的代码不应该正确处理它们的variables吗?
这是我的完整代码:
[Code removed]
我正在试图按照如何正确清理Excel互操作对象的步骤? (第二个答案)
要做到这一点并不容易。 但是,我惊讶以下甚至编译:
excelWorkbook.Cells[1, i] = dgv.Columns[i - 1].HeaderText; var cell = excelWorkbook.Cells[1, i];
也许你的意思是:
excelWorkbook.Cells[1, i].Value = dgv.Columns[i - 1].HeaderText; var cell = excelWorkbook.Cells[1, i];
应该用下面的语句代替:
var cell = excelWorkbook.Cells[1, i]; cell.Value = dgv.Columns[i - 1].HeaderText;
在GC.Collect
和GC.WaitForPendingFinalizers
调用中,我没有看到这一点,因为在cell
和fontSetter
超出范围之前,您GC.WaitForPendingFinalizers
调用了它们。
最后,对Marshal.FinalReleaseComObject
的调用可能应该在finally块中,这样即使抛出exception也会执行它们。
我是通过按照nightcoder指定的方法做到的我如何正确清理Excel互操作对象? 。
你不需要引用任何东西,并且所有东西都是混乱的,它通过ID来closures进程。 希望这可以帮助一个谁来看看。