Génération d'ID numériques uniques à l'aide de DateTime.Now.Ticks
J'ai besoin de générer un code numérique unique à joindre à une demande entrante. Cet ID est utilisé que temporairement pour suivre la demande, et sera supprimé une fois la demande a terminé le traitement. Cet IDENTIFIANT sera utilisé uniquement dans le contexte de cette demande, mais doit être attribué dans une haute performance multi-thread.
Je pensais de l'aide DateTime.Maintenant.Les tiques pour cet ID mais je voudrais savoir si DateTime.Maintenant.Les tiques pourraient générer une collision ID si requêtes simultanées sont simultanément en cours de traitement?
Si quelqu'un pourrait suggérer une meilleure façon de générer ces Id (de préférence un qui n'est pas Int64 comme la Tique est) dans un environnement multi-thread, s'il vous plaît laissez-moi savoir. Quelque chose d'aussi simple qu'un nombre d'incrémentation suffirait même, si seulement je n'ai pas besoin de verrouiller le nombre avant incrémentation.
Merci beaucoup pour toute aide.
source d'informationauteur shyneman
Vous devez vous connecter pour publier un commentaire.
Vous avez juste besoin d'utiliser une variable statique qui est incrémenté chaque fois que vous voulez une autre valeur unique. Vous pouvez faire ce thread-safe et toujours très rapide à l'aide de la Interloqué.Incrément méthode...
DateTime.Now
est absolument terrible à cet effet. Au mieux, vous aurez une résolution de 1 milliseconde; au pire, 17 ms sur NT et 1 seconde (!) sur CE/Compact Framework.Envisager d'utiliser
Interloqué.Incrément
méthode rapide et thread-safe compteur.Commencer par l'ID de thread (si plusieurs threads sont à l'origine de la demande), concaténé avec un par-thread compteur (si chaque thread devrait provenir de plus d'une demande).
Viens d'obtenir un fort nombre aléatoire ou utiliser un GUID
http://msdn.microsoft.com/en-us/library/system.random.aspx
http://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx
Si haute performance est le must have de fonctionnalité, d'affecter des numéros séquentiels dans le monotone de la séquence. Prévenir un conflit de verrouillage par 'réserver' de (20-100) ID de thread qui gère les messages. De cette façon, vous aurez besoin de verrouiller le générateur de séquence qu'une seule fois en 20 à 100 itérations.
Si vous connaissez le nombre de threads que vous allez avoir (ou au moins un upper bound), vous pouvez diviser votre ID d'espace entre votre fils, le calcul de l'ID de la valeur d'un (thread local) compteur et le thread ID - par exemple,
counter_value++ << 8 | thread_id
. Donc, pas de coordination ou de verrouillage entre les threads est nécessaire, et de générer un ID ne nécessite qu'un échelon, un bitshift, et un ou.Si vous utilisez le système ID de thread pour cela, votre Id sera un peu plus long, mais vous n'avez pas besoin d'attribuer manuellement les Identifiants de votre fils.