1


我正在用 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 窗口不可见,它会失败,这使解决方法对我来说不可用。

请指出我做错了什么。
非常感谢!

4

0 回答 0