我有一个线索,我这样开始:
=
这是word文档传递给的函数:
Dim documentConverterThread As New Threading.Thread(AddressOf ConvertToLatestVersion)
documentConverterThread.Start(oDoc)
我尝试做的是,如果在调用.Convert()函数时执行被卡住,则关闭线程和word文档。
我一直在尝试使用计时器,但我需要访问documentConverterThread和oDoc对象来处理Timer.Tick事件:
Private Sub ConvertWordTemplateToLatestVersion(ByVal oDoc As Word.Document)
Try
oDoc.Convert()
oDoc.Save()
oDoc.Close()
Catch ex As Exception
End Try
End Sub
除了在TimerEventProcessor函数中使用私有变量之外,还有其他方法吗?任何帮助表示赞赏。
答案 0 :(得分:2)
您可以为它创建另一个线程。使用Sub()
lambda,您可以创建一个内联委托,您可以从中调用新的计时器方法并将线程变量和文档变量传递给它。然后新线程将等待10秒,如果第一个线程未完成,它将关闭文档。
Private Sub ConvertWordTemplateToLatestVersion(ByVal oDoc As Word.Document)
Dim TimerThread As New Threading.Thread(Sub() TimerThread(documentConverterThread, oDoc))
TimerThread.Start() 'Start the timer thread.
Try
oDoc.Convert()
oDoc.Save()
oDoc.Close()
Catch 'Why catch an exception if we do not even handle it?
End Try
End Sub
Private Sub TimerThread(ByRef dcThread As Threading.Thread, ByRef oDoc As Word.Document)
Threading.Thread.Sleep(10000) 'Wait 10 seconds.
If dcThread.IsAlive() Then 'Close the document if the primary thread isn't finished yet.
dcThread.Abort()
Try
oDoc.Close()
oDoc.Dispose()
Catch
End Try
End If
End Sub
我使用ByRef
而不是ByVal
来确保我们始终引用相同的对象,而不是新创建的对象。