使用VB.NET和CF3.5的Control.Invoke问题

时间:2016-08-16 16:01:56

标签: vb.net multithreading visual-studio-2008 .net-cf-3.5

这是我第一次在应用程序中使用线程。我正在使用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未处理”。

我做错了什么?

2 个答案:

答案 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