Подтвердить что ты не робот

Должен ли я остановить секундомер в конце метода?

Предположим, что у нас есть простые измерения с использованием 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 читается до журналов журнала.

4b9b3361

Ответ 1

Нет, вам не нужно останавливать его. Stop() просто перестает отслеживать прошедшее время. Он не освобождает ресурсы

Ответ 2

Нет, нет необходимости останавливать или убирать это.

Stopwatch не использует неуправляемые ресурсы (если вы думали о IDisposable). На самом деле он вообще не использует никаких ресурсов (кроме памяти, используемой самим объектом, конечно)!

В реализациях Windows.NET (полная .NET Framework, Mono,.NET Core) он просто вызывает Windows API QueryPerformanceCounter() когда это необходимо (при Start() и Stop() и при чтении Elapsed), для получения времени с высоким разрешением. печать.

В Linux-реализациях Mono и .NET Core он использует функцию clock_gettime для получения монотонного возрастающего значения времени.

Любой, кто интересуется деталями реализации: прочитайте этот пост.

Ответ 3

Я думаю, что Stop полезен, если вы хотите повторно использовать значение Elapsed.

Ответ 4

Вы должны остановить секундомер перед тем, как получить время "Элапация"

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);
}

Ответ 5

//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);
            }

        }

    }

}