Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net VSTO excel对象性能问题_Vb.net_Multithreading_Excel_Vsto - Fatal编程技术网

Vb.net VSTO excel对象性能问题

Vb.net VSTO excel对象性能问题,vb.net,multithreading,excel,vsto,Vb.net,Multithreading,Excel,Vsto,嗨 我编写这个小插件示例是为了向您展示一个性能问题以及如何避免它 有人能给我解释一下为什么和它是如何工作的吗 它只是一个excel工作簿的解析,并在主excel进程(0)和计时器创建的随机线程中运行 谢谢 Public Class ThisAddIn Dim a As System.Windows.Threading.Dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher() Dim t As New Threadi

嗨 我编写这个小插件示例是为了向您展示一个性能问题以及如何避免它

有人能给我解释一下为什么和它是如何工作的吗

它只是一个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

您正潜入COM线程模型的世界。这是一个良好的开端

如果代码在Excel主线程上运行(通过设置Dispatcher实现),则COM调用不会跨不同线程封送。由于您有许多COM调用(每个.Value都算作一个),因此开销会增加您所看到的差异

在这种情况下,封送处理代价高昂的原因之一是Excel COM对象在单线程单元(STA)中运行,这意味着在Excel中设置了一个消息循环(实际上是Windows消息循环)来序列化COM调用。您进行的每个跨单元调用都会导致一条消息被发布到此消息循环,该消息循环是在Excel主线程上处理的

因此,由于COM跨单元编组,这两种情况的性能有所不同。考虑到幕后发生的事情,它实际上非常快


在这两种情况下,通过单个调用将大范围的.Value设置为一个值数组会快得多。要以最快的速度(每秒百万个单元格)将数据设置到Excel工作表中,请参见此处:。

您要求我们了解您的加载项是否工作以及原因?看起来你是最有能力做到这一点的人。我看不到工作表的任何解析正在进行。我所看到的是,您正试图在线程调用中的for循环中将1到10000之间的数字写入单元格A1。需要了解的另一件事是,每次调用rng.Value时,这实际上是您正在进行的COM函数调用。在VSTO中,减少性能开销的最佳方法是尽可能减少整个COM函数调用。我的程序执行解析,这只是一个示例,用一个更简单的加载项来说明问题。我想知道为什么调用是实现良好性能所必需的。