VB.NET-Tipp 0105: Zuweisungen in Lambda-Ausdrücken - Vereinfachter threadübergreifender Zugriff auf Steuerelemente
von Spatzenkanonier
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: | Framework-Version(en): .NET Framework 3.5 | .NET-Version(en): Visual Basic 2008 | Download: |
' 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.