Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0105: Zuweisungen in Lambda-Ausdrücken - Vereinfachter threadübergreifender Zugriff auf Steuerelemente

 von 

Beschreibung

Leider unterstützt VB im Vergleich zu C# keine anonymen Methoden. Um eine simple Zuweisung in einem Lambda-Ausdruck verwenden zu können, muss eine Extra-Methode implementiert werden. In diesem Falle wird dies durch die generische Methode "Assign" erreicht. Insbesondere threadübergreifende Aufrufe an Steuerelemente lassen sich so eleganter formulieren.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Framework-Version(en):

.NET Framework 3.5

.NET-Version(en):

Visual Basic 2008

Download:

Download des Beispielprojektes [11,44 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2008
' Option Strict:    An
' Option Infer:     An
'
' Referenzen: 
'  - System
'  - System.Core
'  - System.Data
'  - System.Deployment
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'
' Imports: 
'  - Microsoft.VisualBasic
'  - Microsoft.VisualBasic.ControlChars
'  - System
'  - System.Collections.Generic
'  - System.Data
'  - System.Diagnostics
'  - System.Linq
'  - System.Windows.Forms
'

' ##############################################################################
' ############################ frmAssignLambda.vb ##############################
' ##############################################################################
Public Class frmAssignLambda

    ' Dieser Timer läuft in einem Nebenthread
    Private WithEvents _Timer As New System.Timers.Timer(1000)

    Private Sub frmAssignLambda_Load(ByVal sender As Object, _
        ByVal e As EventArgs) Handles MyBase.Load

        _Timer.Start()
    End Sub

    Private Sub _Timer_Elapsed(ByVal sender As Object, _
        ByVal e As System.Timers.ElapsedEventArgs) Handles _Timer.Elapsed

        Dim F = Function() Me.Label1.Text.Assign(e.SignalTime.ToLongTimeString)
        ' Threadübergreifender Aufruf des Lambdas, der die Zuweisung ans 
        '  Label vornimmt
        Me.BeginInvoke(F)

        ' Dieses würde eine Cross-Thread-Exception provozieren:
        '  Me.Label1.Text = e.SignalTime.ToLongTimeString
    End Sub

End Class

' ##############################################################################
' ############################### modHelpers.vb ################################
' ##############################################################################
Imports System.Runtime.CompilerServices

Public Module modHelpers

    ''' <summary> Function, die eine Zuweisung wrappert </summary>
    ''' <returns>
    ''' False, wenn die Zuweisung nicht ausgeführt wurde, da alter und neuer 
    '''  Wert identisch 
    ''' </returns>
    <Extension()> _
    Public Function Assign(Of T, T2 As T)(ByRef Dest As T, _
        ByVal Src As T2) As Boolean

        If Object.Equals(Dest, Src) Then Return False
        Dest = Src
        Return True
    End Function

End Module

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.