Azure TableQuery Thread-Sicherheit mit Parallel.ForEach

8

Ich habe einige grundlegende Azure-Tabellen, die ich seriell abgefragt habe:

%Vor%

Um dies zu beschleunigen, habe ich das parallelisiert:

%Vor%

Dies führt zu einer erheblichen Beschleunigung, aber die Ergebnisse neigen dazu, zwischen den Läufen leicht unterschiedlich zu sein (d. h. einige der Entitäten unterscheiden sich gelegentlich, obwohl die Anzahl der zurückgegebenen Entitäten genau gleich ist).

Aus dieser und einigen Web-Recherchen schließe ich, dass der obige Enumerator nicht immer Thread-sicher ist. Die Dokumentation scheint darauf hinzuweisen, dass die Thread-Sicherheit nur gewährleistet ist, wenn die Tabellenobjekte öffentlich statisch sind, aber das hat für mich keinen Unterschied gemacht.

Könnte jemand vorschlagen, wie man das löst? Gibt es ein Standardmuster für die Parallelisierung von Azure-Tabellenabfragen?

    
Paul Lambert 05.10.2014, 06:37
quelle

1 Antwort

4

Ihr Kommentar ist korrekt: DataTable eignet sich nicht für gleichzeitige Operationen mit Mutationen und ist die Quelle der doppelten Einträge. Durch das Sperren des DataTable-Objekts für Zeilenmodifizierungsvorgänge wird das Problem behoben:

%Vor%

Wenn Sie NewRow () außerhalb der Sperre platzieren, führt dies zeitweise zu doppelten Zeileneinträgen in der Tabelle oder zu "Eine nicht behandelte Ausnahme vom Typ" System.ArgumentException "in den Ausnahmen von System.Data.dll" in der NewRow () - Zeile. Weitere Details und Alternativen zur gleichzeitigen Verwendung von DataTable finden Sie unter Thread-Sicherheit für DataTable

Verwenden Sie diesen Code, um den Fehlerzustand zu reproduzieren. Einige Läufe werden sauber sein, einige werden doppelte Einträge enthalten und einige werden auf Ausnahmen stoßen.

%Vor%     
Michael Myrah - MSFT 10.07.2015, 20:51
quelle