C# 用于简单跨线程调用Vb.net的自定义调用扩展
我已经阅读了下面的文章,我对这篇文章的vb.net版本非常感兴趣 我希望有一个扩展方法来简化和减少使用委托为backgroundworker/UI更新任务编写的委托代码量。我想获取和设置方法 我在谷歌上尝试了telerik和developer fusion提供的常用代码转换器,但没有成功。开发者融合只是挂起,telerik给我的代码,我无法得到工作,因为它有智能感知错误。我认为这将需要一个人的转变,我将非常感谢任何帮助 谁能给我发一些vb.net代码来实现这一点 例如,文本框和.text属性或组合框和seletedvalue属性 我在这里看到了一套方法C# 用于简单跨线程调用Vb.net的自定义调用扩展,c#,vb.net,multithreading,extension-methods,data-conversion,C#,Vb.net,Multithreading,Extension Methods,Data Conversion,我已经阅读了下面的文章,我对这篇文章的vb.net版本非常感兴趣 我希望有一个扩展方法来简化和减少使用委托为backgroundworker/UI更新任务编写的委托代码量。我想获取和设置方法 我在谷歌上尝试了telerik和developer fusion提供的常用代码转换器,但没有成功。开发者融合只是挂起,telerik给我的代码,我无法得到工作,因为它有智能感知错误。我认为这将需要一个人的转变,我将非常感谢任何帮助 谁能给我发一些vb.net代码来实现这一点 例如,文本框和.text属性或组
但不幸的是,我不认为有一个GET方法。提前谢谢。这在我的脑子里看起来真的很奇怪……但试一下这样的方法:
Imports System.ComponentModel
Imports System.Runtime.CompilerServices
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Task.Run(Sub()
Dim txt As String = TextBox1.InvokeGet(Function(tb) tb.Text)
Label1.InvokeSet(Sub(l) l.Text = "Hello " & txt)
End Sub)
End Sub
End Class
Public Module Module1
<Extension()> _
Public Sub InvokeSet(Of T As ISynchronizeInvoke)(ByVal control As T, ByVal toPerform As Action(Of T))
If control.InvokeRequired Then
control.Invoke(toPerform, New Object() {control})
Else
toPerform(control)
End If
End Sub
<Extension()> _
Public Function InvokeGet(Of T As ISynchronizeInvoke)(ByVal control As T, ByVal toPerform As Func(Of T, Object))
If control.InvokeRequired Then
Return control.Invoke(toPerform, New Object() {control})
Else
Return toPerform(control)
End If
End Function
End Module
好极了很有效,谢谢你。我是这个网站的新手,所以我不能把它归类为答案,也不能投票给它,因为我没有足够的声誉或其他什么。没问题。很高兴这有帮助。我不记得一开始它是怎么工作的。经过一定的时间或点数后,您可以返回并提升和/或接受您喜欢的帖子。