简单的跨线程调用Vb.net的自定义调用扩展

时间:2015-01-19 10:39:17

标签: c# vb.net multithreading extension-methods data-conversion

我已阅读以下文章,我对vb.net版本非常感兴趣。

Microsoft Example Of Generic Method to safely perform Cross-Thread Invoke

我希望有一个扩展方法来简化和减少我需要使用委托为后台工作者/ UI更新任务编写的委托代码量。我想要GET和SET方法。

我已经通过telerik和开发者融合在google上尝试了通常的代码隐蔽程序而没有运气。开发人员融合只是挂起而telerik给我的代码,我无法工作,因为它有智能感知错误。我认为这需要人工转换,我将非常感谢任何帮助。

任何人都可以发一些vb.net代码来实现这一目标。

E.g。文本框和.Text属性或组合框和seletedvalue属性。

我在这里看过SET方法 VB.net avoiding cross thread exception with extension method

但不幸的是,我认为没有GET方法。提前谢谢。

1 个答案:

答案 0 :(得分:0)

这对我的大脑来说看起来很奇怪......但是尝试这样的事情:

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