如果线程在10秒后打开则关闭该线程

时间:2016-03-14 18:22:03

标签: vb.net multithreading

我有一个线索,我这样开始:

=

这是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函数中使用私有变量之外,还有其他方法吗?任何帮助表示赞赏。

1 个答案:

答案 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来确保我们始终引用相同的对象,而不是新创建的对象。