Lambda multiline as Thread参数?

时间:2013-10-21 10:38:24

标签: .net vb.net multithreading lambda delegates

以前我见过像这样的多线程技术代码:

Private Delegate Sub TextBoxUpdateUI(ByVal txt As String)

Private t As Threading.Thread = New Threading.Thread(Sub() _
        If tb2.InvokeRequired Then 
            Dim tb_delegate As New TextBoxUpdateUI(AddressOf "This Sub")
            tb2.Invoke(tb_delegate, Text)
        Else
            tb2.Text = tb1.Text
        End If _
)

问题是,能够在Thread参数中写一些指令,我不记得我见过的那个例子,但如果我记得很清楚它使用的是Lambda,就像我试过的那样使用。

但上面的代码不起作用,只是我想重现它,但我丢失了我见过的例子,所以我不确切知道如何编写它。

有人可以修理lambda吗?

另外,在AdressOf运算符的委托行中,如何修复它以引用它?

3 个答案:

答案 0 :(得分:2)

VB.NET中有两种语法样式:单行和多行。当您进行多行表达式时,您需要在SubFunction声明后立即转到新行。如果不这样做,它将假定它是单行表达式。所以,第一个问题是你在Sub() _之后有一个行继续符,这意味着下面的If语句与Sub声明在同一行,所以它假定它是单行表达式。

第二个问题是,当您编写多行lambda表达式时,必须使用End SubEnd Function语句结束它。您的代码缺少该行。所以,要修复你的代码,只需改变它:

Private t As Threading.Thread = New Threading.Thread(Sub()
        If tb2.InvokeRequired Then 
            Dim tb_delegate As New TextBoxUpdateUI(AddressOf "This Sub")
            tb2.Invoke(tb_delegate, Text)
        Else
            tb2.Text = tb1.Text
        End If
    End Sub
    )
然而,值得一提的是,这是一个可怕的例子。在这个例子中,线程唯一要做的就是调用UI线程,这当然是单线程的,所以额外的线程是完全没必要的。如果你真的想要做的就是 - 在UI线程上调用一些东西,但不要等待UI处理请求 - 你应该只使用BeginInvoke代替Invoke,就像这(不需要新的线程):

If TextBox1.InvokeRequired Then
    TextBox1.BeginInvoke(Sub() TextBox1.Text = "sometext")
Else
    TextBox1.Text = "sometext"
End If

答案 1 :(得分:1)

您不需要线程或委托

    If TextBox1.InvokeRequired Then
        TextBox1.Invoke(Sub() TextBox1.Text = "sometext")
    Else
        TextBox1.Text = "sometext"
    End If

答案 2 :(得分:1)

您可以使用Lambda将AddressOf方法分配给ParameterizedThreadStart

您也可以使用sub()内联编写TextBoxUpdateUi方法,但您必须声明 TextBoxUpdateUI代表。

例如:

Delegate Sub TextBoxUpdateUI(ByVal text As String)

如果你想在Lambda中使用它,就会这样:

   Dim MyThread As New Thread( _
            New ParameterizedThreadStart( _
                Sub()
                    If tb2.InvokeRequired Then
                         Dim tb_delegate As New TextBoxUpdateUI(Sub(x)
                                                               'Do your stuff here
                                                               tb1.Text = x
                                                           End Sub)
                        tb2.Invoke(tb_delegate, Text)
                    Else
                        tb2.Text = tb1.Text
                    End If
                End Sub))