11
votes

DateTime volatile

comme DateTime code> ne peut pas être déclaré aussi volatile, est-ce correct ?:

        private DateTime _time;
        public DateTime Time
        {
            get
            {
                Thread.MemoryBarrier();
                return _time;
            }
            set
            {
                _time = value;
                Thread.MemoryBarrier();
            }
        }
  • J'ai une collection d'éléments difficiles à créer, chacun dispose d'une propriété DateTime nommée créationTime, indiquant lorsque cet article a été créé. Il est initialisé à DateTime.utcnow. Li>
  • Chaque fois qu'un article est accessible, cette propriété est mise à jour sur DateTime.utcnow. Li>
  • Il y a un fil, qui s'exécute en temps opportun dans une minuterie filetée qui vérifie si (DateTime.utcnow + 1 heure)> item.Creationtime, si c'est vrai qu'il supprime l'élément. LI> ul>

    Je veux m'assurer que lorsque le "thread de suppression" entre dans la collection, tous les articles ont leur dernier "dernier accès" DateTime à ce sujet, afin que je puisse éviter de créer à nouveau l'élément simplement parce qu'un cache détenu La valeur pour un couple de millisecondes: D p>

    Merci d'avance. P> p>


6 commentaires

Je ne sais pas si ce que vous essayez de faire a du sens. Comment définissez-vous la dernière version?


Étant donné que vous implémentez un cache qui élimine les objets non utilisés plus anciens qu'une période de temps particulière, je pense que la solution InterlockedExchange est le moyen d'aller ici.


Vous savez que DateTime.NOW n'est que précis à 1/64 de seconde, non? Si vous êtes inquiet de l'inexactitude due aux caches retardant les millisecondes, vous avez déjà perdu; La précision des données que vous essayez de rester précis est de loin, bien inférieure à 1/1000 d'une seconde à tout moment.


@Eric, question: le datetime.now ne pas 't énumérer un 1/64 d'une seconde. Où est-ce documenté?


@ yodaj007: ça fait aussi. Il est indiqué que sur les systèmes d'exploitation NT3.5 et une plus grande précision est d'environ 10 millisecondes, soit 1 / 100ème d'une seconde. "Environ" signifie "pas exactement"; Le système d'exploitation est autorisé à décider de la précision appropriée. C'est généralement proche du fil quantique, pour des raisons évidentes. Sur ma machine, il est précis à 1 / 64ème d'une seconde; votre machine pourrait être meilleure ou pire.


@Eric: gotcha. Je calculais 1/64 = 0,015 seconde, ou 15.6ms. Mais je n'ai pas vu le mot "approximatif". Merci.


3 Réponses :


2
votes

Ce n'est pas possible - vous devrez utiliser verrouillage ou la classe pour synchroniser l'accès au champ.

Ceci est parce que DateTime est un type de valeur - une solide.

de msdn - Volatile (référence C #) :

Le mot clé volatile peut être appliqué aux champs de ces types:

  • Types de référence.
  • Types de pointeur (dans un contexte dangereux). Notez que bien que le pointeur lui-même puisse être volatil, l'objet qu'il pointe ne peut pas. En d'autres termes, vous ne pouvez pas déclarer un «pointeur à volatile».
  • Types tels que Sbyte, octet, Short, Ushort, Int, Uint, Char, Float et Bool.
  • Un type d'enum avec l'un des types de base suivants: octets, Sbyte, Short, Ushort, Int ou Uint.
  • paramètres de type générique connus pour être des types de référence.
  • intptr et uintptr.

    Comme d'autres personnes ont mentionné, vous pouvez utiliser cochs pour suivre l'heure.


0 commentaires