所以它的目的是检查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
答案 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})
这使你的代表一般 - 你可以传递任何计时器并启用/禁用它。