Ich verwende eine Website, die Produktfeeds aus einer Vielzahl von Shops importiert. Diese Feeds können ziemlich groß sein, einige sind bis zu 1 GB. Derzeit importiere ich diese durch die Importfunktion in einer Schleife aufrufen:QueueUserWorkItem mit WaitCallback Abrufen des Rückgabewerts
For i As Integer = 0 To dtAllFeeds.Rows.Count - 1
iImported = ImportFeed(dtAllFeeds(i).id)
totalProductsImported += iImported
lblStatus.Text += "FeedId: " + dtAllFeeds(i).id.ToString + "Items Imported: " + iImported.ToString
If iImported = 0 Then
MailFunctions.NotifyAdmin("feed error: dtAllFeeds(i).id.ToString)
End If
Next i
lblStatus.Text += "Total imported: " + totalProductsImported.ToString
Dies funktioniert, aber wie die Größe oder Anzahl von RSS-Feeds erhöhen, so dass die Zeit tut, sie zu verarbeiten. Also habe ich nicht so elegant erhöht nur das Timeout:
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
_timeOut = Server.ScriptTimeout
Server.ScriptTimeout = 36000 '10 hours
End Sub
Nun möchte ich das nächste abzuschließen für jede Aufgabe, um diese Aufgaben auszuführen, ohne warten vor dem Start, so habe ich versucht, das Setup als here beschrieben, zuerst mit einer Testfunktion TestMultiThread
:
Protected Function TestMultiThread(ByVal Id As Integer, ByVal s As String) As Integer
LogError("s = " + s)
For i As Integer = 0 To (Id * 10000)
Next i
LogError(Id.ToString + " completed")
Return Id * 10000
End Function
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim numThreads = 20
Dim toProcess = numThreads
Dim resetEvent = New ManualResetEvent(False)
Dim i As Integer
For i = 1 To numThreads
ThreadPool.QueueUserWorkItem(New WaitCallback(Sub(state As Object)
TestMultiThread(i, toProcess.ToString)
If Interlocked.Decrement(toProcess) = 0 Then
resetEvent.[Set]()
End If
End Sub), Nothing)
Next i
resetEvent.WaitOne()
End Sub
ich werde dann diese Fehler protokolliert:
s = 20
s = 20
s = 20
21 completed
21 completed
21 completed
s = 19
s = 18
s = 17
21 completed
21 completed
s = 16
21 completed
s = 15
21 completed
s = 14
21 completed
s = 13
21 completed
s = 12
21 completed
s = 11
21 completed
s = 10
21 completed
s = 9
21 completed
s = 8
21 completed
s = 7
21 completed
s = 6
21 completed
s = 5
21 completed
s = 4
21 completed
s = 3
21 completed
21 completed
ich nicht understa nd diese Reihenfolge der Protokollierung, wie ich sehe nicht s = <value>
für 20 eindeutige Werte (aber s=20
sogar 3 mal hintereinander am Anfang und fehlt s=2
und s=1
? Und warum ist i
immer 21 in Funktion TestMultiThread
?
Es heißt "Capturing the Loop var", siehe Antwort unten und [hier (C#)] (http://stackoverflow.com/q/43979917/). –
Aber die eigentliche Frage sollte gewesen sein, "wie Feeds parallel zu verarbeiten", die guten Antworten hätten QueueUserWorkItem nicht beteiligt. –
@Henk Ich habe einen besseren Weg gefunden, um mit der Situation umzugehen, nachdem ich erklärt habe, warum die Verwendung von QUWI zu unerwarteten Ergebnissen geführt hat. – ejohnson