工作线程中Excel Interop性能下降

在工作线程中遇到了非常慢的Excel Interop性能。

这里是我在VSTO项目中的代码,它只是读取指定单元格的值(例如'Sheet1!A1'):

private object test(string sheetRange = "Sheet1!A1") { var targetRange = sheetRange.Split('!'); if (targetRange.Length != 2) { return null; } var sheetname = targetRange[0]; var address = targetRange[1]; var workbook = Application.ActiveWorkbook; var sheet = (Excel.Worksheet)workbook.Worksheets[sheetname]; var cell = sheet.Range[address]; return cell.Value; } 

当我在UI线程中运行这个代码时,它运行得非常快。 但一旦它在工作线程中运行,性能是相当可怕的(约x50 – x100慢)。

  Thread thread = new Thread(() => { test(); }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); thread.Join(int.MaxValue); 

Marshal.ReleaseComObject没有执行,因为这是一个testing代码。

我的代码有什么不好的地方? 或者有什么办法可以避免工作线程中的性能问题?

谢谢

您正跨越两个STA线程之间的COM边界。 COM必须整理所有的通话,这可能是非常昂贵的。

如果您必须在与拥有原始Excel对象的线程不同的线程中拥有与Excel相关的逻辑,那么您应该自己进行编组。 即在该工作线程中执行所需的任何后台逻辑,但要确保在与Excel对象交互时,您可以返回到拥有的线程中,使用调用Excel对象所需的任何数据,以使您的调用可以直接进入Excel COM服务器代码而不是编组。