Multithreading - Thread mit Parameterübergabe starten

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von stevez.

    Multithreading - Thread mit Parameterübergabe starten

    Hallo,

    ich muss folgende Sub in einem neuen Thread starten, und die entsprechenden Variablen übergeben.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub StartTesting(ByVal Auswahlname As String, _
    2. ByVal AwInhalt() As String, _
    3. ByVal Testfallversion As String, _
    4. ByVal uebergabezeit As String, _
    5. ByVal _squishLogPath As FileInfo, _
    6. ByVal _resultPath As FileInfo)

    mit folgender Zeile lässt sich eine Funktion zwar in einem neuen Thread starten, allerdings ohne Parameterübergabe.

    VB.NET-Quellcode

    1. Dim Test As New Threading.Thread(AddressOf StartTesting)


    LG
    Hey,

    eine Möglichkeit:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim threadArgs As New ThreadArguments("huhu", "huhu1", "huhu2")
    4. Dim tS As New Threading.ParameterizedThreadStart(AddressOf DoWork)
    5. Dim t As New Threading.Thread(tS)
    6. t.Start(threadArgs)
    7. End Sub
    8. Private Sub DoWork(ByVal o As Object)
    9. Dim args As ThreadArguments = DirectCast(o, ThreadArguments)
    10. Dim result As String = String.Concat(args.paramA, args.paramB, args.paramC)
    11. MessageBox.Show(result)
    12. End Sub
    13. Private Class ThreadArguments
    14. Public paramA As String
    15. Public paramB As String
    16. Public paramC As String
    17. Public Sub New(ByVal pA As String, ByVal pB As String, ByVal pC As String)
    18. Me.paramA = pA
    19. Me.paramB = pB
    20. Me.paramC = pC
    21. End Sub
    22. End Class
    23. End Class


    Andere Möglichkeit:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim a As Action(Of String, String, String)
    4. a = AddressOf DoWork
    5. a.BeginInvoke("huhu", "huhu1", "huhu2", Nothing, Nothing)
    6. End Sub
    7. Private Sub DoWork(ByVal paramA As String, ByVal paramB As String, ByVal paramC As String)
    8. MessageBox.Show(String.Concat(paramA, paramB, paramC))
    9. End Sub
    10. End Class


    Gibt bestimmt noch ein paar mehr, aber eine von Beiden würd ich wählen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Schau Dir Variante 1 mal genau an. Da ist ne Private Class drinne.

    Variante 2 musst nur die Signaturen ändern.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    SpaceyX schrieb:

    Gibt bestimmt noch ein paar mehr, aber eine von Beiden würd ich wählen.

    Wenn man VS2010 benutzt so würde ich den Delegaten eher durch eine anonyme Methode ersetzen: leichter und übersichtlicher als das Delegatengefummel

    VB.NET-Quellcode

    1. ....
    2. Dim t As New Threading.Thread(Sub() DoSomething("Hello")) With {.IsBackground = True}
    3. t.Start()
    4. ....
    5. Sub DoSomething(ByVal s As String)
    6. Debug.Print(s) ' zum testen
    7. End Sub