嗨 我寫了這個小的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