Double retourné par un Guid.NewGuid()?
Nous avons une application qui génère des données simulées pour l'un de nos services à des fins de test. Chaque élément de données a un Guid unique. Cependant, lorsque nous avons couru un test après quelques petites modifications au code du simulateur de tous les objets générés par il avait le même Guid.
Il n'y a qu'un seul objet de données créée, puis une boucle où les propriétés de l'objet ont été modifiés, y compris un nouveau Guid unique, et il a été envoyé au service via l'accès distant (serializable, pas maréchal-par-ref, si c'est ce que vous pensez), la boucle et le faire à nouveau, etc.
Si nous avons mis un petit Fil.Le sommeil( ...) à l'intérieur de la boucle, il a généré id unique. Je pense que c'est une diversion. J'ai créé une application de test qui venez de créer un guid après l'autre et ne pas obtenir un seul double.
Ma théorie est qu'IL a été optimisée dans un chemin qui a provoqué ce comportement. Mais assez parlé de mes théories. Qu'en pensez-VOUS? Je suis ouvert aux suggestions et aux façons de le tester.
Mise à JOUR: Il semble y avoir beaucoup de confusion au sujet de ma question, permettez-moi de préciser. Je NE pense PAS que NewGuid() est cassé. Clairement, il fonctionne. Ses BEAUX! Il y a un bug quelque part, cependant, que les causes NewGuid ():
1) être appelé qu'une seule fois dans ma boucle
2) être appelé à chaque fois que dans ma boucle, mais attribuée qu'une seule fois
3) quelque chose d'autre que je n'ai pas pensé
Ce bug peut être dans mon code (le PLUS probable) ou dans l'optimisation de quelque part.
Donc de réitérer ma question, comment dois-je debug ce scénario?
(et merci pour le grand débat, c'est vraiment de m'aider à clarifier le problème dans mon esprit)
Mise à JOUR # 2: j'aimerais poster un exemple qui montre le problème, mais c'est une partie de mon problème. Je ne peux pas les reproduire à l'extérieur de l'ensemble de la suite d'applications (clients et serveurs).
Ici est pertinente extrait de:
OrderTicket ticket = new OrderTicket(... );
for( int i = 0; i < _numOrders; i++ )
{
ticket.CacheId = Guid.NewGuid();
Submit( ticket ); //note that this simply makes a remoting call
}
Ah, oui. J'ai pensé que. Mais mon estimation initiale était qu'il serait probablement dans le JIT de l'optimiseur. Ne pouvez pas utiliser un Réflecteur pour que.
Si vous ne pensez pas que c'est un NewGuid bug, puis après un peu de code qui montre le problème. Ou, au moins, poste le code que a la question. Aussi, répondre à la question de savoir si la suppression du Fil.Sommeil provoque le problème réapparaît. Je suis assez bon à psychiques de débogage - mais encore mieux avec quelques détails.
Oui. Le fil du sommeil causés à se comporter correctement, et la suppression il a renvoyé l'erreur. Le compoundage mon problème est que je suis totalement incapable de reproduire le problème en dehors de toute cette suite d'applications.
OriginalL'auteur dviljoen | 2008-11-19
Vous devez vous connecter pour publier un commentaire.
Ne Soumettez faire un appel asynchrone, ou ne le billet objet d'aller dans un autre fil de discussion à tout moment.
Dans l'exemple de code que vous réutilisez le même objet. Que faire si les Soumettre envoie le billet dans un thread d'arrière-plan après un court délai (et ne prenez pas une copie). Lorsque vous modifiez le CacheId vous êtes en fait la mise à jour de tous dans l'attente de la soumet. Cela explique aussi pourquoi un Thread.Sommeil résout le problème. Essayez ceci:
Si, pour une raison quelconque, cela n'est pas possible, essayer cela et voir si ils sont toujours les mêmes:
regarde comme j'aimerais gagner ce pari, après tout. 🙂
OriginalL'auteur
Des milliers de développeurs utilisent des Guid .NET. Si Guid.NewGuid() avait tendance à rester "coincé" sur une valeur, le problème aurait été rencontrés il y a longtemps.
Le mineur modifications de code sont le coupable ici. Le fait que Fil de discussion.Le sommeil (qui est moins un hareng rouge qu'un poisson pourrissant au soleil) "fixe" votre problème suggère que vos biens sont en train d'être définie dans une certaine façon bizarre qui ne peut pas prendre effet avant que la boucle s'arrête de blocage (soit par la fin ou par Fil.Le sommeil). Je serais même prêt à parier que la "modification mineure" a été pour réinitialiser toutes les propriétés à partir d'un thread séparé.
Si vous avez posté un exemple de code, qui pourrait l'aider.
Allez, post code. Guid.NewGuid() n'est pas le problème.
Bon, j'ai voté en vous parce que, oui, je serais payer. 😉
Homme de bien. Je vais aller au hasard upvote un tas de vos réponses. 🙂 Désolé pour le "poisson pourrissant au soleil" remarque.
Euh ... en supposant que vous êtes un homme. Progammer l'habitude.
OriginalL'auteur
C'est un bug dans votre code. Si vous avez réussi à générer plusieurs guid c'est l'explication la plus probable. L'idée est ici, dans votre question: "lorsque nous avons lancé un test après quelques petites modifications au code du simulateur tous les objets générés par il avait le même Guid"
C'est le problème avec les générateurs de nombres aléatoires, vous ne pouvez jamais être sûr.
Je ne crois pas que. Le guid a un peu de hasard, et oui, théoriquement, les doublons sont "possible", mais pas TOUS. C'est clairement pas la question ici. Il y a quelque chose de mal, soit par notre code ou de l'optimiseur. Mon problème est que je ne sais pas comment faire pour savoir quelle. Des Suggestions?
Comment découper le code en bas de la minimal qui reproduit le problème et de le poster ici.
OriginalL'auteur
Voir ce l'article sur la façon dont un Guid est créé.
Cet artcile est venu de Cette réponse.
Ligne de fond si vous créez le Guid trop rapidement et l'horloge n'a pas été déplacé vers l'avant, c'est pourquoi vous obtenez le même. Toutefois, lorsque vous mettez un sommeil en elle fonctionne parce que l'horloge s'est déplacé.
Désolé, j'avais voter pour toi en bas pour ne pas pleinement la lecture de l'article que vous avez associé.
OriginalL'auteur
Le code de la Soumettre et de OrderTicket serait utile...
Vous êtes à la réutilisation OrderTicket. J'avais suspect que vous (ou remoting lui-même) est le dosage appelle - probablement à l'égard de nombre de connexions/d'hôte limites et de la cueillette jusqu'à la dernière valeur de CacheId quand enfin il les envoie.
Si vous débogage ou de Fil.Le sommeil de l'app, vous êtes de modifier le déroulement de sorte que le remoting appel finitions avant de vous attribuer un nouveau CacheId.
Êtes-vous asyncing remoting appel? Je pense que la synchronisation appel de bloc - mais j'aimerais vérifier avec un renifleur de paquets comme Wireshark pour être sûr. Peu importe, simplement en changeant la création d'une nouvelle OrderTicket à chaque itération serait probablement faire l'affaire.
Edit: La question est de pas sur NewGuid être cassé...donc ma réponse précédente a été supprimée.
Si vous savez que c'est un bug (ce qui signifie que vous pensez que c'est une appli bug), alors pourquoi le titre "Double retourné par un Guid.NewGuid()" et de la théorie que c'est l'équipe de l'optimiseur de causer un problème?
Que pour Que pour la fixation sur le "caractère unique d'un Guid", qui n'est même pas proche de ce que j'étais allongée. Une sortie de l'entropie ou non interceptée échoué malloc (par exemple) pourrait causer toutes sortes de problèmes - y compris répété Guid (potentiellement - de nouveau, c'est tiré par les cheveux pour la théorie que vous sélectionnez est cassé, état d'esprit).
Merci de lire ma mise à JOUR ci-dessus. Je ne dis pas NewGuid est cassé. Je n'ai jamais voulu même insinuer que (avec le recul, je suis juste en train de lire mon affichage du titre et oui, il ne sembler de cette façon ... désolé). Et je n'ai pas de "select est cassé la" mentalité. J'ai un bug que je ne sais pas comment le trouver.
OriginalL'auteur
Je ne sais pas les détails de la façon dont les Guid sont générés.. encore. Cependant, actuellement, mon org. de reproduction est Guid à un taux qui permettrait de mettre le lapin à la honte. Donc, je peux attester du fait que Guid ne sont pas cassé.. pourtant.
Faites-nous savoir comment ça se passe... cela vous semble intéressant.
OriginalL'auteur
Mon intuition me dit quelque chose le long de ces lignes est en cours...
Journal de la valeur de CacheId dans un fichier journal tous les temps de son nom avec une trace de la pile ... Peut-être quelqu'un d'autre.
Ce qui se passe lorsque vous vous connectez la valeur + le système.diagnostics pile trac ...
OriginalL'auteur