Wie wäre es mit einer parallelen Verwendung von Interlocked.Exchange für die Thread-Sicherheit :) Beachten Sie, dass Interlocked.Exchange nur mit einem Referenztyp funktioniert (dh ein Struktur- oder Schlüsselwertpaar (sofern es nicht in eine Klasse eingeschlossen ist) funktioniert nicht der Maximalwert.
Hier ist ein Beispiel aus meinem eigenen Code:
ClassificationResult maxValue = new ClassificationResult(-1,-1,double.MinValue);
Parallel.ForEach(pTotals, pTotal =>
{
if(pTotal.Value > maxValue.score)
{
Interlocked.Exchange(ref maxValue, new
ClassificationResult(mhSet.sequenceId,pTotal.Key,pTotal.Value));
}
});
BEARBEITEN (Code aktualisiert, um mögliche Rennbedingungen oben zu vermeiden):
Hier ist ein robusteres Muster, das auch die parallele Auswahl eines Min-Werts zeigt. Ich denke, dies behebt die in den Kommentaren unten erwähnten Bedenken hinsichtlich einer möglichen Rennbedingung:
int minVal = int.MaxValue;
Parallel.ForEach(dictionary.Values, curVal =>
{
int oldVal = Volatile.Read(ref minVal);
int val = ~oldVal;
while (oldval > curVal && oldval != val)
{
val = oldval;
oldval = Interlocked.CompareExchange(ref minVal, curVal, oldval);
}
});