Ответ 1
Нет, вам не нужно останавливать его. Stop()
просто перестает отслеживать прошедшее время. Он не освобождает ресурсы
Предположим, что у нас есть простые измерения с использованием 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:
В типичном сценарии Stopwatch вы вызываете метод Start, , а затем вызываете метод Stop, а затем проверяете прошедшее время, используя свойство Elapsed.
Я не уверен, должен ли я назвать этот метод, когда мне больше не интересен экземпляр таймера. Должен ли я "очистить" с помощью метода Stop
?
ИЗМЕНИТЬ
Имейте в виду, что Logger.Log(..) ничего не стоит, потому что timer.Elapsed
читается до журналов журнала.
Нет, вам не нужно останавливать его. Stop()
просто перестает отслеживать прошедшее время. Он не освобождает ресурсы
Нет, нет необходимости останавливать или убирать это.
Stopwatch
не использует неуправляемые ресурсы (если вы думали о IDisposable
). На самом деле он вообще не использует никаких ресурсов (кроме памяти, используемой самим объектом, конечно)!
В реализациях Windows.NET (полная .NET Framework, Mono,.NET Core) он просто вызывает Windows API QueryPerformanceCounter()
когда это необходимо (при Start()
и Stop()
и при чтении Elapsed
), для получения времени с высоким разрешением. печать.
В Linux-реализациях Mono и .NET Core он использует функцию clock_gettime
для получения монотонного возрастающего значения времени.
Любой, кто интересуется деталями реализации: прочитайте этот пост.
Я думаю, что Stop полезен, если вы хотите повторно использовать значение Elapsed.
Вы должны остановить секундомер перед тем, как получить время "Элапация"
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);
}
}
}
}