我正在用 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 窗口不可见,它会失败,这使解决方法对我来说不可用。
请指出我做错了什么。
非常感谢!