EMZETT.
Login

Kurz: Module Program Function Groesster(Of T As IComparable(Of T))(liste As T()) As T Dim m As T = liste(0) For Each x In liste If x.CompareTo(m) > 0 Then m = x Next Return m End Function

Teil des Kurses Visual Basic .NET

Kapitel 6 von 8 im Kurs Visual Basic .NET. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Generics

Public Class Kiste(Of T)
    Public Property Inhalt As T
    Public Sub New(inhalt As T)
        Me.Inhalt = inhalt
    End Sub
    Public Function Zeige() As String
        Return $"Kiste mit {Inhalt}"
    End Function
End Class
 
Module Program
    Function Groesster(Of T As IComparable(Of T))(liste As T()) As T
        Dim m As T = liste(0)
        For Each x In liste
            If x.CompareTo(m) > 0 Then m = x
        Next
        Return m
    End Function
 
    Sub Tausche(Of T)(ByRef a As T, ByRef b As T)
        Dim tmp As T = a
        a = b
        b = tmp
    End Sub
 
    Sub Main()
        Console.WriteLine(New Kiste(Of Integer)(42).Zeige())
        Console.WriteLine(New Kiste(Of String)("Text").Zeige())
        Console.WriteLine(Groesster({3, 9, 4}))
        Console.WriteLine(Groesster({"b", "z", "a"}))
        Dim a As String = "x", b As String = "y"
        Tausche(a, b)
        Console.WriteLine(a & b)
    End Sub
End Module

Ausgabe:

Kiste mit 42
Kiste mit Text
9
z
yx

Async und Await

Imports System.Threading.Tasks
 
Module Program
    Async Function BerechneAsync(n As Integer) As Task(Of Integer)
        Await Task.Delay(10)
        Return n * n
    End Function
 
    Async Function HauptAsync() As Task
        Dim e1 = Await BerechneAsync(3)
        Console.WriteLine(e1)
        Dim aufgaben = Enumerable.Range(1, 5).Select(Function(i) BerechneAsync(i)).ToArray()
        Dim ergebnisse = Await Task.WhenAll(aufgaben)
        Console.WriteLine(String.Join(" ", ergebnisse))
        Dim erste = Await Task.WhenAny(BerechneAsync(7), Task.Delay(1000).ContinueWith(Function(t) -1))
        Console.WriteLine(Await erste)
    End Function
 
    Sub Main()
        HauptAsync().GetAwaiter().GetResult()
        Dim t = Task.Run(Function() Enumerable.Range(1, 100).Sum())
        Console.WriteLine(t.Result)
    End Sub
End Module

Ausgabe:

9
1 4 9 16 25
49
5050

Threads und Sperren

Imports System.Threading
 
Module Program
    Private zaehler As Integer = 0
    Private ReadOnly sperre As New Object()
 
    Sub Zaehle()
        For i As Integer = 1 To 1000
            SyncLock sperre
                zaehler += 1
            End SyncLock
        Next
    End Sub
 
    Sub Main()
        Dim threads As New List(Of Thread)
        For i As Integer = 1 To 4
            Dim t As New Thread(AddressOf Zaehle)
            threads.Add(t)
            t.Start()
        Next
        For Each t In threads
            t.Join()
        Next
        Console.WriteLine(zaehler)
 
        Dim summe As Integer = 0
        Parallel.For(1, 101, Sub(i) Interlocked.Add(summe, i))
        Console.WriteLine(summe)
    End Sub
End Module

Ausgabe:

4000
5050

Merke

  • Generics: Class Kiste(Of T), Function F(Of T As IComparable(Of T))(...)
  • Async Function ... As Task(Of T) mit Await; Task.WhenAll für Parallelität
  • Threads, SyncLock und Interlocked schützen gemeinsamen Zustand
  • Parallel.For verteilt Arbeit auf mehrere Kerne

Übungsaufgabe

Berechne mit Task.WhenAll die Quadratzahlen von 1 bis 10 parallel.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Strings, Dateien, Datum und Fehler

Weiter: Praxisprojekte

Alle Kapitel: Visual Basic .NET im Überblick