2016-08-04 37 views
0

Ich versuche, ein VB.net (Framework 4.5) zu schreiben, die sehen wird, ob 1000 Proxy-Server sind und ich möchte sie in Stapeln von 10 verarbeiten zu einer Zeit. Ich habe versucht, mit Threads, threadpool und haben eine leere gezeichnet, so sind jetzt auf die Verwendung einer parallelen Methode jedoch die Ausgabe ist nicht in Ordnung.Wann Threads oder Parallel zu verwenden, HTTPWebRequests in Reihenfolge zu bekommen, in Synchronisierung

Public Sub Get_Items_Click(sender As Object, e As EventArgs) Handles Get_Items_Button.Click 

    Dim ParallelOpts As New ParallelOptions() 
    ParallelOpts.MaxDegreeOfParallelism = 10 

    Parallel.For(0, 2000, ParallelOpts, AddressOf ProxySub) 


End Sub 

Public Sub ProxySub(ByVal ItemNumber As Integer) 

‘Do some work … See if Proxy is up and running using HTTPWebRequest and output to a SyncLock textbox 


End sub 

Die ProxySub macht einen HttpWebRequest auf verschiedenen Servern, damit ich, dass die Reihenfolge zu verstehen, in dem sie zurückkehren wird nicht immer in der gleichen Reihenfolge, in der sie jedoch gesendet werden, ich synchronisieren müssen den Ausgang.

Auch wenn die "ParallelOpts.MaxDegreeOfParallelism = 10" gesetzt ist, warum sehe ich den Ausgang von 0 bis 40 springen?

Die Ausgabe wäre wie folgt; 0, 40, 5, 63, 7, 23, 1, 9 und so weiter.

Wie kann ich es synchronisieren, so dass die Ausgabe in Ordnung wäre, d.h. 0, 1, 2, 3, 4 und so weiter.

Vielen Dank für jede Eingabe können Sie

Antwort

0

Es ist nicht ausreichend, geben Sie Ihre Textbox SyncLock. Sie müssen die Änderung im UI-Thread vornehmen.

Public Sub ProxySub(ByVal ItemNumber As Integer) 

    'Do some work … See if Proxy is up and running using HTTPWebRequest and output to a SyncLock textbox 

    OnResultReceived(new MyResultObject(itemNumber, data)) 

End Sub 

Public Sub OnResultReceived(result As MyResultObject) 
    'Any thread can call this 
    If InvokeRequired Then 
     'It wasn't the UI thread. Call this method again from the ui thread. 
     Me.BeginInvoke(Sub() OnResultReceived(result)) 
    Else 
     'This is now on the ui thread 
     'Add the sorted results to the textbox 
     TextBox.Text = ... 
    End If 
End Sub 

Um den Text hinzufügen, um Sie die Ergebnisse in einem SortedList und Verwendung string.join speichern könnten oder das Textfeld in eine Listenansicht ändern, die die Sortierung verarbeiten kann.

+0

Hallo FloatingKiwi Vielen Dank für Ihre Eingabe, es wird sehr geschätzt. Seit der Veröffentlichung habe ich festgestellt, dass meine Herangehensweise nicht die beste ist, und ich habe jetzt einige Erfolge mit einem "Await AsyncHTTPWeb" gemacht. –