前段时间,我看到了这样的多线程技术代码:
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
操作员的委托行中,如何解决此问题?
VB.NET中的lambda表达式有两种语法样式:单行和多行。在执行多行表达式时,实际上需要在Sub
orFunction
声明之后立即转到新行。如果您不这样做,它将假定它是单行表达式。因此,第一个问题是您在后面有一个换行符,Sub() _
这意味着以下If
语句与Sub
声明在同一行,因此假定它是单行表达式。
第二个问题是,当编写多行lambda表达式时,必须以End Sub
orEnd 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句