1

前段时间我见过这样的多线程技术代码:

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操作员的代表线上,我该如何修复它以引用它?

4

3 回答 3

2

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

第二个问题是,当您编写多行 lambda 表达式时,您必须以End SuborEnd 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
于 2013-10-21T13:03:01.377 回答
1

您不需要线程或委托

    If TextBox1.InvokeRequired Then
        TextBox1.Invoke(Sub() TextBox1.Text = "sometext")
    Else
        TextBox1.Text = "sometext"
    End If
于 2013-10-21T11:23:51.317 回答
1

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

您也可以TextBoxUpdateUi使用 sub() 内联编写方法,但必须声明 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))
于 2013-10-21T12:24:05.893 回答