17 Stimmen

Wie übergibt man mehrere Parameter in einem Thread in VB

Ich möchte zwei oder mehr Parameter an einen Thread in VB 2008 übergeben.

Die folgende Methode (geändert) funktioniert gut ohne Parameter, und meine Statusleiste wird sehr cool-y aktualisiert. Aber ich kann nicht scheinen, um es mit einem, zwei oder mehr Parameter zu arbeiten.

Dies ist der Pseudo-Code von dem, was ich denke, sollte passieren, wenn die Taste gedrückt wird:

Private Sub Btn_Click() 

Dim evaluator As New Thread(AddressOf Me.testthread(goodList, 1))
evaluator.Start()

Exit Sub

Dies ist die Methode testthread:

Private Sub testthread(ByRef goodList As List(Of OneItem), ByVal coolvalue As Integer)

    StatusProgressBar.Maximum = 100000
    While (coolvalue < 100000)
        coolvalue = coolvalue + 1
        StatusProgressBar.Value = coolvalue
        lblPercent.Text = coolvalue & "%"
        Me.StatusProgressBar.Refresh()
    End While

End Sub

44voto

Dario Punkte 47246

Zuallererst : AddressOf holt nur den Delegaten zu einer Funktion - Sie können nichts anderes angeben (d.h. keine Variablen erfassen).

Es gibt zwei Möglichkeiten, ein Thema zu starten.

  • Pass an Action im Konstruktor und nur Start() das Thema.
  • Pass a ParameterizedThreadStart und vorwärts un zusätzliches Objektargument für die Methode, auf die beim Aufruf von .Start(parameter)

Letztere Option halte ich für einen Anachronismus aus der Zeit vor den Generika und Lambda - die spätestens mit VB10 zu Ende gegangen sind.

Vous podría verwenden Sie diese grobe Methode und erstellen Sie eine Liste oder Struktur, die Sie wie folgt an Ihren Threading-Code übergeben einzelner Objektparameter aber da wir 此処に於て Schließungen haben, können Sie den Thread einfach auf einem anonymen Sub die alle notwendigen Variablen selbst kennt (was eine Arbeit ist, die der Compiler für Sie erledigt).

Soo ...

Dim Evaluator = New Thread(Sub() Me.TestThread(goodList, 1))

Es ist wirklich nur das ;)

5voto

jgauffin Punkte 97446

Etwa so (ich bin kein VB-Programmierer)

Public Class MyParameters
    public Name As String
    public Number As Integer
End Class

newThread as thread = new Thread( AddressOf DoWork)
Dim parameters As New MyParameters
parameters.Name = "Arne"
newThread.Start(parameters);

public shared sub DoWork(byval data as object)
{
    dim parameters = CType(data, Parameters)

}

4voto

Manuel Alves Punkte 3533
Dim evaluator As New Thread(Sub() Me.testthread(goodList, 1))
With evaluator
.IsBackground = True ' not necessary...
.Start()
End With

3voto

Konrad Rudolph Punkte 503837

Die einfachste Methode besteht darin, eine geeignete Klasse/Struktur zu erstellen, die alle Ihre Parameterwerte enthält, und diese an den Thread zu übergeben.

Eine andere Lösung in VB10 ist, die Tatsache zu nutzen, dass Lambdas eine Verschluss , was im Grunde bedeutet, dass der Compiler die oben genannten Aufgaben automatisch für Sie erledigt:

Dim evaluator As New Thread(Sub()
                                testthread(goodList, 1)
                            End Sub)

3voto

Jay Punkte 2605

Zusätzlich zu dem, was Dario über die Delegaten gesagt hat, können Sie einen Delegaten mit mehreren Parametern ausführen:

Legen Sie Ihren Delegierten fest:

Private Delegate Sub TestThreadDelegate(ByRef goodList As List(Of String), ByVal coolvalue As Integer)

Abrufen eines Handles für den Delegaten, Erstellen von Parametern in einem Array, DynamicInvoke für den Delegaten:

Dim tester As TestThreadDelegate = AddressOf Me.testthread
Dim params(1) As Object
params(0) = New List(Of String)
params(1) = 0

tester.DynamicInvoke(params)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X