嗨 我写了这个小的AddIn样本向您展示性能问题以及如何避免它VSTO Excel对象性能问题
有人能解释我为什么,它是如何工作的?
它只是一个excel工作簿的解析,运行在主excel进程(0)和计时器创建的随机线程中。
谢谢!
Public Class ThisAddIn
Dim a As System.Windows.Threading.Dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher()
Dim t As New Threading.Thread(New Threading.ParameterizedThreadStart(AddressOf threadTest))
Dim tm As New System.Timers.Timer(20000)
Delegate Sub TestHandler()
Dim tt As TestHandler = AddressOf test
Private Sub ThisAddIn_Startup() Handles Me.Startup
tm.AutoReset = True
tm.Start()
AddHandler tm.Elapsed, AddressOf threadTest
End Sub
Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
End Sub
Public Sub test()
Dim appE As Excel.Application = Globals.ThisAddIn.Application
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
End Sub
Private Sub threadTest()
' 800 ms
Dim o() As Object
a.Invoke(tt, o)
'12 seconds !
test()
End Sub
End Class
你问我们想知道你的加载项是否工作,为什么?看起来你会是最能做到这一点的人。 – IAmTimCorey 2011-05-09 14:51:20
我在这里看不到任何工作表的解析。我所看到的是,你正试图在一个线程调用的for循环中写入一个从1到10,000的数字到单元格A1。 – code4life 2011-05-09 15:01:35
还有一件事要认识到,每次你调用rng.Value时,这实际上是一个你正在做的COM函数调用。在VSTO中,降低性能开销的最佳方法是尽可能减少整体COM函数调用。 – code4life 2011-05-09 15:03:00