这是我第一次在应用程序中使用线程。我正在使用VB.NET,VS2008和CF3.5
我做了一个小测试项目,试图了解Threading的工作原理,特别是在尝试访问另一个线程中的UI控件时。我的表格只是一个按钮,表示“开始”,按下时应按“停止”来回切换。
这是我的测试项目的代码,我把它放在一起,看看我在网上找到的几个例子。
Public Class Form1
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
Dim myThread As New System.Threading.Thread(AddressOf ChangeText)
myThread.Start()
End Sub
Private Sub ChangeText()
If button1.InvokeRequired Then
Me.Invoke(New Threading.WaitCallback(AddressOf ChangeText))
Else
If button1.Text = "Start" Then button1.Text = "Stop"
If button1.Text = "Stop" Then button1.Text = "Start"
End If
End Sub
它构建和部署就好了但是当我单击Button时,我在Invoke上得到“ArgumentException未处理”。
我做错了什么?
答案 0 :(得分:0)
我已经重写了Invoke,只是使用lambda来调用子例程。此外,我从Invoke更改为BeginInvoke,因为您无需等待它完成。
Public Class Form1
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
Dim myThread As New System.Threading.Thread(AddressOf ChangeText)
myThread.Start()
End Sub
Private Sub ChangeText()
If button1.InvokeRequired Then
Me.BeginInvoke(Sub() ChangeText())
Else
If button1.Text = "Start" Then button1.Text = "Stop"
If button1.Text = "Stop" Then button1.Text = "Start"
End If
End Sub
End Class
[编辑]
我修改了代码以使用委托代替lamdbas。
Public Class Form1
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
Dim myThread As New System.Threading.Thread(AddressOf ChangeText)
myThread.Start()
End Sub
Private Sub ChangeText()
If button1.InvokeRequired Then
Me.BeginInvoke(New Threading.ThreadStart(AddressOf ChangeText)))
Else
If button1.Text = "Start" Then button1.Text = "Stop"
If button1.Text = "Stop" Then button1.Text = "Start"
End If
End Sub
End Class
答案 1 :(得分:-2)
这是最终有效的代码:
Public Class Form1
Delegate Sub TextDelegte()
Private myTextSub As TextDelegte = New TextDelegte(AddressOf ChangeText)
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
Dim myThread As New System.Threading.Thread(AddressOf ChangeText)
myThread.Start()
End Sub
Private Sub ChangeText()
If button1.InvokeRequired Then
Invoke(myTextSub)
System.Threading.Thread.Sleep(100)
Else
If button1.Text = "Start" Then
button1.Text = "Stop"
ElseIf button1.Text = "Stop" Then
button1.Text = "Start"
End If
End If
End Sub
End Class