以前我见过像这样的多线程技术代码:
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
运算符的委托行中,如何修复它以引用它?
答案 0 :(得分:2)
VB.NET中有两种语法样式:单行和多行。当您进行多行表达式时,您需要在Sub
或Function
声明后立即转到新行。如果不这样做,它将假定它是单行表达式。所以,第一个问题是你在Sub() _
之后有一个行继续符,这意味着下面的If
语句与Sub
声明在同一行,所以它假定它是单行表达式。
第二个问题是,当您编写多行lambda表达式时,必须使用End Sub
或End 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))