J'ai décompilé la classe Stopwatch dans .NET 2.0 et .NET 4.0 en utilisant Reflector, puis j'ai comparé les différences pour voir comment elle était réparée. En plus de l'ajout de la nouvelle méthode de redémarrage, cela est tout ce que je trouve une différence:
public void Stop()
{
if (this.isRunning)
{
long num2 = GetTimestamp() - this.startTimeStamp;
this.elapsed += num2;
this.isRunning = false;
// THE NEXT 4 LINES ARE NEW IN .NET 4.0:
if (this.elapsed < 0L)
{
this.elapsed = 0L;
}
}
}
Donc, fondamentalement, elles fixeraient se sont écoulées à 0 dans la méthode d'arrêt si la valeur est négative. Il ya encore des bogues IMHO:
- Que faire si l'utilisateur lit l'une des propriétés Elapsed avant d'arrêter le chronomètre? Vous pourriez toujours avoir une valeur négative.
- La réinitialisation à 0 n'est pas correcte. Certains temps devait s'être écoulé, même si ce n'était que quelques microsecondes!
- Il ne fait rien pour gérer les valeurs écoulées positives inhabituellement grandes que moi et d'autres ont rapportées.
EDIT: Malheureusement, # 2 et # 3 sont au-delà de la puissance du .NET Framework:
est ici au cœur du problème: à partir de MSDN sur QueryPerformanceCounter qui est l'API utilisée par le Chronomètre Sur un ordinateur multiprocesseur, peu importe le processeur appelé . Cependant, vous pouvez obtenir des résultats différents sur différents processeurs en raison de bogues dans le système d'entrée/sortie de base (BIOS) ou la couche d'abstraction matérielle (HAL). Pour spécifier l'affinité du processeur pour un thread , utilisez la fonction SetThreadAffinityMask. N'utilisez pas simplement le chronomètre .NET 4.0 et supposez que le problème est résolu. Ce n'est pas le cas et ils ne peuvent rien y faire, à moins que vous ne vouliez qu'ils aient de l'affinité avec votre thread. A partir de la documentation de la classe Chronomètre:
Sur un ordinateur multiprocesseur, peu importe quel processeur le fil fonctionne sur. Toutefois, en raison de bogues dans le BIOS ou le matériel Abstraction Layer (HAL) , vous pouvez obtenir différents résultats de synchronisation sur différents processeurs.Pour spécifier l'affinité du processeur pour un thread, utilisez la méthode ProcessThread.ProcessorAffinity.
Quelle est la valeur de ElapsedMilliseconds lorsqu'elle est négative? –
Désinstallez votre condensateur de flux. –
Ça change à chaque fois. Il peut prendre plusieurs tours de boucle pour que le nombre négatif se produise. –