从另一个线程激活计时器

时间:2013-08-07 22:04:35

标签: vb.net multithreading timer ftp

所以它的目的是检查ftp服务器的连接,如果ftp是up,则启用timer1。我已经读过线程不能像同步那样工作,而且会导致问题。没有线程它工作正常,但程序挂起并停止响应。

如何从其他线程激活计时器? 也许调用和委托可以工作?但我不知道该怎么做。

Public Function CanPortOpen(ByVal HostName As String, ByVal Port As Integer) As Boolean
    Dim TCP As New System.Net.Sockets.TcpClient
    Try
        TCP.Connect(HostName, Port)
    Catch
    End Try
    If TCP.Connected = True Then
        CanPortOpen = True
        TCP.Close()
        Timer1.Enabled = True
    Else
        CanPortOpen = False
        TCP.Close()
        Timer1.Enabled = False
        FTPup.Abort()
    End If
End Function

Public Sub CheckConnection()
    CanPortOpen("HostName", Port)
End Sub

Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    TestFTP = New System.Threading.Thread(AddressOf CheckConnection)
    TestFTP.IsBackground = True
    TestFTP.Priority = Threading.ThreadPriority.AboveNormal
    TestFTP.Start()
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    FTPup = New System.Threading.Thread(AddressOf UploadToFTP)
    FTPup.IsBackground = True
    FTPup.Priority = Threading.ThreadPriority.AboveNormal
    FTPup.Start()
End Sub

1 个答案:

答案 0 :(得分:1)

我认为在您开始深入了解线程之前,您应该首先查看BackgroundWorker组件。您可以在设计器的工具栏上找到它,并将其放在表单上。它为您提供了几个活动

DoWork - 将此事件与您在后台线程中完成的任何内容联系起来

RunWorkerCompleted - 挂钩此事件以在主(UI)线程中运行代码,在线程完成时触发。此处的代码可以正常与UI对象进行交互。

还有其他事件允许您向主线程报告进度等.BackgroundWorker组件的目的是使这样的简单多线程任务更容易。

文档是 - > here

参见 - > here有关如何使用EventArgs将数据从工作线程传递到主线程的示例。


或者,如果你只想从你的线程运行计时器,你可以这样做:

 'Declare an appropriate delegate
 Delegate Sub dlgTimerEnable(ByVal enable as Boolean)
 'the delegate should match the method signature
 Private Sub TimerEnable(ByVal enable as Boolean)
     Timer1.Enabled = enable
 End Sub

然后在你的线程程序

Public Function CanPortOpen(ByVal HostName As String, ByVal Port As Integer) As Boolean
    Dim TCP As New System.Net.Sockets.TcpClient
    Try
        TCP.Connect(HostName, Port)
    Catch
    End Try
    If TCP.Connected = True Then
        CanPortOpen = True
        TCP.Close()
        Me.Invoke(New dlgTimerEnable(AddressOf TimerEnable), New Object() {True})
    Else
        CanPortOpen = False
        TCP.Close()
        Me.Invoke(New dlgTimerEnable(AddressOf TimerEnable), New Object() {False})
        FTPup.Abort()
    End If
End Function

此处Invoke导致该方法在拥有Timer1的线程上执行(假设这是表单中Me将引用您的表单的方法)。参数作为对象传递。

您甚至可以将此作为使用任何计时器的一般方法,例如:

Delegate Sub dlgTimerEnable(ByRef tmr As Timer, ByVal enable As Boolean)

Private Sub TimerEnable(ByRef tmr As Timer, ByVal enable As Boolean)
    tmr.Enabled = enable
End Sub

然后:

Me.Invoke(New dlgTimerEnable(AddressOf TimerEnable), New Object() {Timer1, True})

这使你的代表一般 - 你可以传递任何计时器并启用/禁用它。