| 

.NET C# Java Javascript Exception

1
Die Überschrift sagt eigentlich schon genug aus. Ich möchte aus einem Sub heraus 2 Threads starten, und zwar mit Übergabe einer Variablen. Mit Multi-Threading bin ich übrigens ein absoluter Newbie...
So sieht im Moment mein Roh-Code aus:

Imports System.Threading
Public Class klasse
Dim Variablen 'ist in Wirklichkeit ein ganzer Block

Public Sub Button14_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button14.Click
'Vorbereitende Arbeit
'Hier soll der Thread routine 2x gestartet werden - jeweils mit einer Variable
Dim first As Thread = New Thread(AddressOf routine)
first.Start()
End Sub

Public Sub routine(ByVal start as Integer)
For x = start to maximum Step 2
'Hier die eigentliche Arbeit mit variablen, die oben definiert wurden
Next
End Sub

End Class


Ich möchte also aus Button14_Click heraus 2x routine starten (nicht öfters) - mit einem individuellen Übergabewert. Wenn ich jetzt das hier mache, meldet er mir einen Fehler beim Überladen: "Fehler bei der Überladungsauflösung, da keine zugreifbare "New" mit diesen Argumenten aufgerufen werden kann[...]"
Wenn ich stattdessen schreibe
Dim first As Thread = New Thread(AddressOf routine(0))

kommt "AddressOf-Operand muss dem Namen einer Methode entsprechen (ohne Klammern)". Wie bekomme ich das jetzt am Besten hin?

Noch gleich die nächste Frage dazu:
Wartet das aufrufende Sub, bis die Threads beendet sind? Ich rechne mit Laufzeiten von wenigen Tagen (von mir geschätzte Zeit im "Normalmodus" sind im Moment mehrere Tage).
News:
30.05.2011
muffi 1,4k 1 9
2 Antworten
2
Hallo,

erstelle keine Threads per new Thread - das ist eine sehr aufwändige Operation und nicht notwendig da bereits beim Anwendungstart Threads erstellt werden und im ThreadPool vorgehalten sind. Schau dir am Besten die Doku zum ThreadPool an. Dort findest du auch Beispiele für die Parameterübergabe bzw. die Verwendung mit Closures.

mfG Gü
30.05.2011
gfoidl 9,4k 3 5
0
Zunächst zur zweiten Frage: nein, das aufrufende Sub wartet nicht, sondern kehrt nach dem Start der beiden Threads sofort zurück.

Und zur Sicherheit: Du kannst aus den neu gestarteten Threads heraus nicht die GUI manipulieren! Wenn Du also das Ergebnis deiner routine irgendwo anzeigen willst, mußt Du Dich mit der Invoke-Methode (im Fall von Windows Forms) beschäftigen.

Zur ersten Frage: gfoidl hat Dich schon in die richtige Richtung geschickt. Du kannst z.B. QueueUserWorkItem verwenden. In C# würde das so aussehen:
ThreadPool.QueueUserWorkItem(_ => routine(42));
ThreadPool.QueueUserWorkItem(_ => routine(4711));
30.05.2011
Matthias Hlawatsch 13,2k 4 9

Stelle deine .net-Frage jetzt!