Descompilé la clase Stopwatch en .NET 2.0 y .NET 4.0 usando Reflector y luego comparé las diferencias para ver cómo se corrigió. Además de la adición del nuevo método de reinicio, esto es todo lo que encontré para una diferencia:
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;
}
}
}
Así que, básicamente, se pusieron pasaron a 0 en el método Stop si el valor es negativo. Todavía hay errores en mi humilde opinión:
- ¿Qué pasa si el usuario lee cualquiera de las propiedades transcurridas antes de detener el cronómetro? Aún puede obtener un valor negativo.
- Restablecer a 0 no es correcto. ¡Ha transcurrido un tiempo de, aunque haya sido solo unos pocos microsegundos!
- No hace nada para manejar los valores positivos positivos inusualmente grandes que yo y otros hemos informado.
EDIT: Desafortunadamente, # 2 y # 3 son más allá del poder de .NET Framework:
Aquí está el núcleo del problema: desde MSDN en QueryPerformanceCounter que es el API utilizada por el cronómetro clase:
En una computadora multiprocesador, no debería importar qué procesador se llama . Sin embargo, se puede obtener diferentes resultados en diferentes procesadores debido a los errores en el sistema básico de entrada/salida (BIOS) o la capa de abstracción de hardware (HAL). Para especificar la afinidad del procesador para un hilo , use la función SetThreadAffinityMask.
No utilice el cronómetro .NET 4.0 y suponga que el problema está solucionado. No lo es y no pueden hacer nada al respecto a menos que quieras que arruinen tu afinidad con el hilo. De la documentación de la clase Cronómetro:
En una computadora multiprocesador, no importa en qué procesador se ejecuta el subproceso . Sin embargo, debido a errores en el BIOS o el Hardware capa de abstracción (HAL), puede obtener resultados diferentes en temporización procesadores diferentes.Para especificar la afinidad del procesador para un hilo, use el método ProcessThread.ProcessorAffinity.
¿Cuál es el valor de ElapsedMilliseconds cuando es negativo? –
Desinstale su condensador de flujo. –
Cambia todo el tiempo. Puede tomar varios giros de bucle para que ocurra un número negativo. –