从另一个线程访问Excel对象模型

时间:2012-06-17 19:55:29

标签: vb.net multithreading excel interop


我正在用VB.NET编写一个有助于生成Excel报告的库 我是.NET / VS2010的新手,很抱歉,如果我想做错事 我需要的一个功能是启动一个线程来执行某些工作(从Access数据源刷新工作簿)的例程,而主线程检查由于刷新失败而在Excel窗口中是否弹出任何对话框。

我遇到的问题是新线程无法引用Excel.Application对象。它不会产生错误,只会冻结。
以下是我的情况演示:

Imports System.Threading
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Imports Microsoft.Office.Interop

Public Class xlTest
    Public xlApp As Excel.Application

    Sub DoBackgroundStuff()
        MsgBox ("DoBackgroundStuff() says: " & xlApp.Version)
    End Sub

    Sub New()
        xlApp = New Excel.Application
        MsgBox ("New() says: " & xlApp.Version)

        Dim t As New System.Threading.Thread(AddressOf DoBackgroundStuff)
        t.Start()
        Do While t.IsAlive
            System.Threading.Thread.Sleep (100)
        Loop

        xlApp.Quit()
    End Sub
End Class

DoBackgroundStuff过程在尝试引用XlApp的任何部分时冻结,而不会抛出异常。如果我在DoBackgroundStuff中添加一个断点并尝试观察XlApp,那么它的所有属性都会变成“无法评估表达式”。
- 线程中的任何其他成员都可以被线程阅读 - 我尝试通过从进程ID获取Excel.Application对象(它工作得很好)来解决方法,但由于此方法使用MainWindowHandle,如果Excel窗口不可见,它将失败,这使得我的解决方法无法使用。 />
请指出我做错了什么。
非常感谢!

0 个答案:

没有答案