c# - tiempo - ¿Debo detener el cronómetro al final del método?
stopwatch c# (5)
Imaginemos que tenemos mediciones simples usando Stopwatch
public void DoWork()
{
var timer = Stopwatch.StartNew();
// some hard work
Logger.Log("Time elapsed: {0}", timer.Elapsed);
timer.Stop(); // Do I need to call this?
}
Según MSDN:
En un escenario típico de cronómetro, usted llama el método de inicio, luego , finalmente, el método de parada , y luego verifica el tiempo transcurrido usando la propiedad de tiempo transcurrido.
No estoy seguro de si debería llamar a este método cuando ya no estoy interesado con la instancia del temporizador. ¿Debo "aclarar" usando el método Stop
?
EDITAR
Tenga en cuenta que Logger.Log (..) no cuesta nada porque timer.Elapsed
se lee antes de que el logger timer.Elapsed
sesión.
Creo que Stop es útil si desea reutilizar el valor Elapsed.
Debes detener el cronómetro antes de que llegue el tiempo de Elapased.
static void Main()
{
// Create new stopwatch
Stopwatch stopwatch = new Stopwatch();
// Begin timing
stopwatch.Start();
// Do something
for (int i = 0; i < 1000; i++)
{
Thread.Sleep(1);
}
// Stop timing
stopwatch.Stop();
// Write result
Console.WriteLine("Time elapsed: {0}",
stopwatch.Elapsed);
}
No, no hay necesidad de detenerlo o limpiarlo.
Stopwatch
no usa ningún recurso no administrado (si piensa en IDisposable
). En realidad, no utiliza ningún recurso en absoluto!
En las implementaciones de Windows de .NET (.NET Framework completo, Mono, .NET Core), solo llama al API de Windows QueryPerformanceCounter()
cuando es necesario (en Start()
y en Stop()
y cuando se lee en Elapsed
) para recuperar un tiempo de alta resolución sello.
En las implementaciones de Linux de Mono y .NET Core, utiliza la función clock_gettime
para recuperar un valor de tiempo creciente monótono.
Para cualquier persona con curiosidad real sobre los detalles de la implementación: lea esta publicación .
No, no necesitas pararlo. Stop()
simplemente detiene el seguimiento del tiempo transcurrido. No libera recursos.
//disposable StopWatch
internal class StopWatch :Stopwatch, IDisposable
{
public StopWatch()
{
Start();
}
private string _name;
public string Name
{
get => _name;
set => _name = $"{value} ";
}
public void Dispose()
{
Stop();
Debug.Print(string.Format("{0}RunTime {1:00}:{2:00}:{3:00}.{4:00}", Name, Elapsed.Hours, Elapsed.Minutes,Elapsed.Seconds, Elapsed.Milliseconds / 10));
}
}
//Use example
internal class SomeClass
{
private static void Some()
{
using (var stopWatch = new StopWatch())
{
// Do something
for (int i = 0; i < 1000; i++)
{
Thread.Sleep(1);
}
}
}
}