2016-06-10 9 views
0

Ich habe 3 Threads, die innerhalb einer Schleife aufgerufen werden.Wie pausiere ich Schleife, während Multithreading lebt

For i As Integer = 0 To DG.Rows.Count - 1 
    Dim thread1 = New System.Threading.Thread(AddressOf processData) 
    Dim thread2 = New System.Threading.Thread(AddressOf processData2) 
    Dim thread3 = New System.Threading.Thread(AddressOf processData3) 
    If Not thread1.IsAlive Then 
     x1 = i 
     thread1.Start() 
    ElseIf Not thread2.IsAlive Then 
     x2 = i 
     thread2.Start() 
    ElseIf Not thread3.IsAlive Then 
     x3 = i 
     thread3.Start() 
    End If 
Next 

Wie pausiere ich die Schleife, während alle Threads leben? Was ich will, ist, wenn einer der Threads beendet ist, dann die Schleife fortsetzen und die (i), dann pausieren Sie die Schleife erneut, wenn es keine verfügbaren Threads gibt. Weil manchmal DG.Rows Artikel mehr als 3 sind.

+0

Wollen Sie sagen, dass Sie drei Threads verwenden möchten, um die Zeilen so zu verarbeiten, dass die Zeilen 0, 3, 6 usw. von 'processData' verarbeitet werden und die Zeilen 1, 4, 7 usw. von 'processData2' verarbeitet werden 'und Zeilen 2, 5, 8 usw. von' processData3', aber nur drei Zeilen gleichzeitig? – Enigmativity

+0

Ich möchte 3 Daten gleichzeitig verarbeiten, und Schleife anhalten, während Thread1, Thread2, Thread3 beschäftigt ist, dann Schleife fortsetzen, wenn ein Thread verfügbar ist –

+0

Das ist immer noch nicht klar. Wie ordnen Sie jede Zeile jeder Verarbeitungsmethode zu? – Enigmativity

Antwort

0

Ich denke, du willst so etwas machen. Nicht pausieren, nur einen Thread pro Schleifeniteration starten.

For i As Integer = 0 To DG.Rows.Count - 1 
    Dim thread1 = New System.Threading.Thread(AddressOf processData) 
    thread1.Start(i) 
Next 

Aber in jedem Fall, ich glaube nicht, dass Sie new System.Threading.Thread in jeder Schleife anrufen möchten. Diese sollten außerhalb der For-Schleife verschoben werden.

+0

Vielen Dank für Ihre Hilfe, aber was ich will, ist Zeit zu sparen, das ist, warum ich 3 Threads –

3

Lassen Sie das Framework dies für Sie behandeln: Verwenden Sie die ThreadPool.

Zuerst ein Array erstellen, um Thread-Status für jede Position zu halten:

Dim doneEvents(DG.Rows.Count) As ManualResetEvent 

Wie das x1, x2, Variablen, muss diese sowohl von Ihrem Haupt-Thread und das processData Verfahren zugänglich sein.

ändern Sie dann Ihre processData Methode ein Object Argument am Anfang zu übernehmen und ein Resetevent am Ende gesetzt:

Public Sub processData(ByVal data As Object) 
    Dim x As Integer = CInt(data) 

    '... 
    'Existing code here 

    doneEvents(x).Set() 
End Sub 

Jetzt können Sie sie nur Warteschlange alle so zusammen:

For i As Integer = 0 To DG.Rows.Count - 1 
    ThreadPool.QueueUserWorkItem(processData, i) 
Next 
WaitHandle.WaitAll(doneEvents) 
Console.WriteLine("All data is processed.") 

Obwohl ich vermute, dass Sie auch die Daten aus Ihrem Raster für jede Zeile an die Methode processData übergeben sollten.

Sie können auch die neueren Async/Await Schlüsselwörter verwenden, aber ich werde es schwer haben, ein Beispiel dafür zu schreiben, ohne etwas über den Inhalt von processData zu wissen.

+0

Vielen Dank so wie verwende ich thread2 und thread3?Der Grund, warum ich Multithread benutze, ist meine Arbeit zu teilen, denn wenn ich nur thread1 verwende, processdata tooks 30 Sekunden, also versuche ich 3 Prozessdaten gleichzeitig zu bearbeiten –

+0

Die Prozessdaten post curl zu meinem Server und und schickte es zurück mein Werkzeug, es tooks 30 Sekunden für jede Gitterreihe Antwort, also ich möchte meine Arbeit teilen, wenn Werkzeug 3 Gegenstand gleichzeitig verarbeiten kann, spart es Zeit und kann schnell tun –

+0

@JuliusMalundras Wenn Sie den threadpool zur Verwendung begrenzen möchten drei Threads können Sie dann die Methode ['SetMaxThreads'] (https://msdn.microsoft.com/en-us/library/system.threading.threadpool.setmaxthreads (v = vs.110) .aspx) verwenden. –

0

Es könnte sein, dass Sie Parallel Methoden TPL die Nutzung der Code wie folgt schreiben:

Parallel.For(_ 
    0, _ 
    DG.Rows.Count, _ 
    New ParallelOptions() With {.MaxDegreeOfParallelism = 3}, _ 
    Sub(i) processData(i)) 

Ich verstehe nicht, warum Sie processData haben, processData2 und processData3 though.

Verwandte Themen