Hallo,
ich schreibe von mehreren Threads in ein DataSet, dass geht halt solange gut, wie nur wenige Änderungen sind.
Sobald aber einige Änderungen kommen und auch neue Datensätze hinzugefügt werden, gibt es die ganze Bandbreite an Exceptions...
Hier mal mein Code in gekürzter Form, damit man versteht, wie der Vorgang ca. abläuft.
Spoiler anzeigen
Von daher ist es klar, dass es so noch nicht geht... Meine Idee wäre jetzt, dass die Threads die Änderungen ermitteln sollen und dann
eventuelle Änderungen zurückmelden und im MainThread werden dann halt die ganzen Änderungen und Updates in einer Schleife in die
Tabellen eingetragen. Nur leider komme ich an der Stelle nicht weiter.
1) Was müsste von den Threads zurückgeliefert werden? Ich würde am liebsten direkt die fertige Row zurückgeben, allerdings bräuchte ich
dann noch eine extra Unterscheidung was die Änderungen von Zeilen betrifft. Also einmal neue Zeile hinzufügen und einmal Zeileinhalt ändern.
2)Wie würde der Programmaufbau aussehen? Wie könnte man es realisieren?
Ich müsste mir wohl eine Art
oder
Eventuell gehts auch mit einer Art
Also falls mir da wer weiterhelfen könnte, wie ich das threadsicher aufbauen könnte, wäre ich sehr dankbar.
Auch hilfreiche Links, die Lambda Ausdrücke einfach erklären, wären mir hilfreich. Und auch wie diese Syntax dann immer geht, wo man
Sub() und Function() etc alles in eine Reihe ballert... Problem ist halt der Aufbau dieser ganzen Verkettungen, ich weiß in etwa was ich brauche,
ich kann es nur nicht in VB Code übersetzen.
ich schreibe von mehreren Threads in ein DataSet, dass geht halt solange gut, wie nur wenige Änderungen sind.
Sobald aber einige Änderungen kommen und auch neue Datensätze hinzugefügt werden, gibt es die ganze Bandbreite an Exceptions...
Hier mal mein Code in gekürzter Form, damit man versteht, wie der Vorgang ca. abläuft.
VB.NET-Quellcode
- Private _ctsLoad As CancellationTokenSource
- Private _poL As ParallelOptions
- Private Async Sub btnStatLoad_Click(sender As Object, e As EventArgs) Handles btnStatLoad.Click
- _ctsLoad = New CancellationTokenSource
- _poL = New ParallelOptions
- _poL.CancellationToken = _ctsLoad.Token
- _poL.MaxDegreeOfParallelism = Environment.ProcessorCount
- Dim z As New List(Of TestDBDataSet.TestTabelleRow)
- For Each row In TestDBDataSet.TestTabelle
- z.Add(row)
- Next
- Await Task.Run(Sub() Parallel.ForEach(z, _poL, AddressOf LoadData))
- End Sub
- Private Sub LoadData(row As TestDBDataSet.TestTabelleRow)
- _poL.CancellationToken.ThrowIfCancellationRequested()
- 'Load Data from XML...
- Dim Trefferliste = 'Prase the XML-Content into Trefferliste...
- If Trefferliste(0).Count = 1 Then
- If row.TestDatum <> CDate(Trefferliste(0).Datum.Value) Then
- row.TestDatum = CDate(Trefferliste(0).Datum.Value)
- Dim newLogRow = TestDBDataSet.Log.NewLogRow
- With newLogRow
- .Eintrag = "Neues Datum..."
- .Änderung = CDate(Trefferliste(0).Datum.Value)
- End With
- TestDBDataSet.Log.AddLogRow(newLogRow)
- End If
- End If
- End Sub
Von daher ist es klar, dass es so noch nicht geht... Meine Idee wäre jetzt, dass die Threads die Änderungen ermitteln sollen und dann
eventuelle Änderungen zurückmelden und im MainThread werden dann halt die ganzen Änderungen und Updates in einer Schleife in die
Tabellen eingetragen. Nur leider komme ich an der Stelle nicht weiter.
1) Was müsste von den Threads zurückgeliefert werden? Ich würde am liebsten direkt die fertige Row zurückgeben, allerdings bräuchte ich
dann noch eine extra Unterscheidung was die Änderungen von Zeilen betrifft. Also einmal neue Zeile hinzufügen und einmal Zeileinhalt ändern.
2)Wie würde der Programmaufbau aussehen? Wie könnte man es realisieren?
ParallelForEach
liefert ja nur den ParallelLoopState
zurück. Ich müsste mir wohl eine Art
List (Of Task (Of MyDataRow))
erstellen, die in einer Schleife abfeuern und dann irgendwie mit Task.WhenAny
oder
ContinueWith
(sowas in der Art), die Änderungen/Updates übertragen.Eventuell gehts auch mit einer Art
Progress (Of)
wo ich dann zentral einen Sync Lock einbaue? Sowas in etwa?Also falls mir da wer weiterhelfen könnte, wie ich das threadsicher aufbauen könnte, wäre ich sehr dankbar.
Auch hilfreiche Links, die Lambda Ausdrücke einfach erklären, wären mir hilfreich. Und auch wie diese Syntax dann immer geht, wo man
Sub() und Function() etc alles in eine Reihe ballert... Problem ist halt der Aufbau dieser ganzen Verkettungen, ich weiß in etwa was ich brauche,
ich kann es nur nicht in VB Code übersetzen.