【发布时间】:2011-04-28 16:47:39
【问题描述】:
我正在用 VB 中的 VS2010 为 Office 2007 编写 Excel 插件,在与 PowerPoint 中的 Excel 对象模型交互时,我遇到了严重的性能问题。 请在下面找到一个基本测试来证明问题(sub test())。
我们以 4 种不同的方式尝试了这段代码,得到了不同的结果:
- 直接从 PowerPoint 调用 Excel 对象模型:平均 13 秒
- 通过 Excel 插件托管的 WCF 服务从 PowerPoint 调用此代码:平均 9 秒
- 通过计时器从 Excel 插件调用此代码(启动时,等待 20 秒并启动 test()):9 秒
- 通过功能区按钮直接从 Excel 插件调用代码:800 毫秒
我可以理解为什么 1. 很慢,因为代码与 Excel 不在同一个 AppDomain 中。 我也可以理解为什么 2. 和 3. 很慢,因为代码没有在 Addin Thread 中执行。 但我想不出任何其他解决方案来解决我的性能问题。
最后我有两个问题
1) 当我说方法 2 和 3 由于多线程而慢时,我是否走在正确的轨道上?
2) 一般而言,我怎样才能在 .Net 应用程序中使用 Excel 对象模型而不会出现这样的性能损失。
提前感谢您提出的任何想法。
尼古拉斯
Public Sub test(ByVal appE As Excel.Application)
Dim chrono As New System.Diagnostics.Stopwatch
chrono.Start()
appE.Interactive = False
appE.ScreenUpdating = False
Dim wb As Excel.Workbook = appE.ActiveWorkbook
Dim ws As Excel.Worksheet = wb.ActiveSheet
Dim rng As Excel.Range = ws.Cells(1, 1)
Dim nbit As Integer = 10000
For i = 1 To nbit
rng.Value = i
Next
appE.ScreenUpdating = True
appE.Interactive = true
chrono.Stop()
MsgBox(chrono.ElapsedMilliseconds.ToString + " " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString)
End Sub
【问题讨论】:
标签: vb.net multithreading excel powerpoint