Я пишу Excel AddIn для Office 2007 с VS2010 в VB, и у меня возникают серьезные проблемы с производительностью при взаимодействии с объектной моделью Excel из PowerPoint.
Ниже приведен базовый тест для демонстрации проблемы (sub test ()).
Мы пробовали этот код 4 разными способами с разными результатами:
- Вызов объектной модели Excel напрямую из PowerPoint: в среднем 13 с
- Вызов этого кода из PowerPoint через службы WCF, размещенные в надстройке Excel: в среднем 9 с
- Вызов этого кода из надстройки Excel через таймер (при запуске подождите 20 секунд и запустите тест ()): 9 с
- Вызов кода непосредственно из надстройки Excel через кнопку ленты: 800 мс
Я могу понять разницу, почему 1. медленный, поскольку код не находится в том же AppDomain, что и Excel.
Я также могу понять, почему 2. и 3. работают медленно, поскольку код не выполняется в потоке надстройки.
Но я не могу придумать какое-либо дополнительное решение для решения проблемы с производительностью.
В конце у меня два вопроса
1) Я на правильном пути, когда говорю, что методы 2 и 3 медленны из-за многопоточности?
2) В общем, как я могу использовать объектную модель Excel из приложения .Net и не иметь такой потери производительности.
Заранее благодарим вас за любые идеи, которые у вас могут быть.
Nicolas
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