Должен ли я остановить секундомер в конце метода?
давайте представим, что у нас есть простые измерения с помощью 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?
}
согласно MSDN:
в типичном сценарии секундомера вы вызываете метод Start,затем в конечном итоге вызовите метод Stop, а затем вы проверяете истекшее время, используя свойство Elapsed.
Я не уверен, если я должен вызвать этот метод, когда я больше не хочу с экземпляра таймера. Я должен "очистить" с помощью Stop
метод?
EDIT
имейте в виду, что регистратор.Бревно.(.) ничего не стоит, потому что timer.Elapsed
читать до журналы регистратора.
5 ответов:
нет, вам не нужно останавливать его.
Stop()
просто перестает отслеживать прошедшее время. Это не освобождает никаких ресурсов
нет, нет необходимости останавливать или убирать его.
Stopwatch
не использует никаких неуправляемых ресурсов (если вы подумали оIDisposable
). Он на самом деле не использует любой ресурсы вообще!в реализациях windows .NET (full .NET Framework, Mono, .NET Core) он просто вызывает
QueryPerformanceCounter()
Windows API при необходимости (onStart()
иStop()
и при чтенииElapsed
) для получения отметки времени с высоким разрешением.В Linux реализации Mono и .NET Core, он использует
clock_gettime
функция для получения монотонного увеличения значения времени.для тех, кто с реальным любопытством о деталях реализации: читать этот пост.
вы должны остановить секундомер, прежде чем получить истекшее время
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); }
//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); } } } }