Da DateTime
nicht als volatile
deklariert werden kann, ist das richtig?
private DateTime _time;
public DateTime Time
{
get
{
Thread.MemoryBarrier();
return _time;
}
set
{
_time = value;
Thread.MemoryBarrier();
}
}
Diese Eigenschaft könnte von verschiedenen Threads aus zugegriffen werden, daher möchte ich sicherstellen, dass sie immer die neueste Version erhalten, ohne Verwendung von Sperren (lock
).
BEARBEITEN:
- Ich habe eine Sammlung von schwer zu erstellenden Elementen, von denen jedes eine
DateTime
-Eigenschaft namensCreationTime
hat, die angibt, wann dieses Element erstellt wurde. Es wird aufDateTime.UtcNow
initialisiert. - Jedes Mal, wenn ein Element abgerufen wird, wird diese Eigenschaft auf
DateTime.UtcNow
aktualisiert. - Es gibt einen Thread, der regelmäßig in einem Thread-Timer ausgeführt wird und überprüft, ob
if (DateTime.UtcNow + 1 Stunde) > Element.CreationTime
ist, falls es wahr ist, löscht es das Element.
Ich möchte sicherstellen, dass wenn der "Löschthread" in die Sammlung kommt, alle Elemente ihren neuesten "letzten Zugriff" DateTime
haben, damit ich vermeiden kann, das Element erneut zu erstellen, nur weil ein Cache den Wert für ein paar Millisekunden gehalten hat. :D
0 Stimmen
Nicht sicher, ob das, was du versuchst zu tun, einen Sinn ergibt. Wie definierst du die neueste Version?
1 Stimmen
Angesichts dessen, dass Sie einen Cache implementieren, der ungenutzte Objekte entfernt, die älter als ein bestimmter Zeitraum sind, denke ich, dass die
InterlockedExchange
-Lösung hier der richtige Weg ist.2 Stimmen
Sie sind sich bewusst, dass DateTime.Now nur genau bis zu 1/64 einer Sekunde ist, oder? Wenn Sie sich über Ungenauigkeiten aufgrund von Caches, die um Millisekunden verzögert sind, sorgen, dann haben Sie bereits verloren; die Präzision der Daten, die Sie versuchen korrekt zu halten, ist zu jeder Zeit weit weniger als 1/1000 einer Sekunde.
1 Stimmen
@Eric, Frage: Der DateTime.Now listet keine 1/64 Sekunde auf. Wo ist das dokumentiert?
1 Stimmen
@yodaj007: Das stimmt auch. Es besagt, dass bei Betriebssystemen NT3.5 und höher die Genauigkeit etwa 10 Millisekunden oder 1/100 Sekunde beträgt. "Etwa" bedeutet "nicht genau"; das Betriebssystem darf selbst entscheiden, welche Genauigkeit angemessen ist. Es liegt in der Regel nahe am Thread-Quanta, aus offensichtlichen Gründen. Auf meinem Computer ist es genau auf 1/64 Sekunde; Ihr Computer könnte besser oder schlechter sein.
1 Stimmen
@Eric: Verstanden. Ich habe 1/64 = 0,015 Sekunden oder 15,6 ms berechnet. Aber ich habe das Wort "ungefähr" nicht gesehen. Danke.
0 Stimmen
Einigermaßen verwandt: Thread sichere DateTime-Aktualisierung mit Interlocked.*