Die Referenzzuweisung ist atomar. Warum wird Interlocked.Exchange (ref Object, Object) benötigt?
In meinem Multithread-asmx-Webdienst hatte ich ein Klassenfeld _allData meines eigenen Typs SystemData, das aus wenigen bestehtList<T>
undDictionary<T>
markiert alsvolatile
. Die Systemdaten (_allData
) wird von Zeit zu Zeit aktualisiert und ich erstelle ein anderes Objekt mit dem NamennewData
und füllen Sie seine Datenstrukturen mit neuen Daten. Wenn es fertig ist, weise ich es einfach zu
private static volatile SystemData _allData
public static bool LoadAllSystemData()
{
SystemData newData = new SystemData();
/* fill newData with up-to-date data*/
...
_allData = newData.
}
Dies sollte funktionieren, da die Zuweisung atomar ist und die Threads, die auf alte Daten verweisen, diese weiterhin verwenden und der Rest die neuen Systemdaten direkt nach der Zuweisung enthält. Aber mein Kollege hat das gesagt, anstatt es zu benutzenvolatile
Stichwort und einfache Zuordnung sollte ich verwendenInterLocked.Exchange
weil er sagte, dass es auf einigen Plattformen nicht garantiert ist, dass die Referenzzuweisung atomar ist. Außerdem: wenn ich erklärethe _allData
Feld alsvolatile
das
Interlocked.Exchange<SystemData>(ref _allData, newData);
erzeugt Warnung "Ein Verweis auf ein flüchtiges Feld wird nicht als flüchtig behandelt" Was soll ich darüber denken?