Как сделать время истекшим методом?

Мне нужен метод, который дал бы мне время, затраченное на процесс. Я вызываю его в начале процесса и вызываю его снова в конце процесса, а метод print показывает общее время, прошедшее.

Это мой метод, но всегда печатайте время в 00:00. Почему происходит это??

public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions)
    {
        var stopwatch = new System.Diagnostics.Stopwatch();

        LogBinaryWriter BinaryWriter = new LogBinaryWriter();
        string timeElapsed = "";
        if(time == true)
        {
            stopwatch.Start();
        }
        if (time == false) 
        {
            stopwatch.Stop(); 
            TimeSpan timeSpan = stopwatch.Elapsed;
            timeElapsed = (string.Format("\nFile Generated: {0}\nTime Elapsed: {1} minute(s) {2} second(s)",
            BinaryWriter.CreateLogFileName(filePath, Convert.ToInt32(logSelected)),
            timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds / 10 + "\n"));
            userOptions.DisplayUserMessage(timeElapsed);

        }           
    } 

7 ответов

Решение

Ваш stopwatch переменная является локальной. Когда вы вызываете функцию во второй раз, она снова инициализируется.

Вы должны переместить объявление на уровень класса.

System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();

public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions)
{
   ... etc

Посмотри, где ты декларируешь stopwatch; это локальная переменная. Это означает, что вы создаете и используете два разных секундомера; первый запускается, когда вы вызываете метод с "истинным" параметром, затем удаляется, когда метод заканчивается, и переменная выходит из области видимости. Второе объявляется, никогда не запускается, затем его время проверяется и регистрируется.

Чтобы решить эту проблему, объявите переменную экземпляра ("поле") для секундомера. Это будет держать его в области действия до тех пор, пока объект находится рядом, то есть он будет продолжать работать после завершения метода и останется тем же экземпляром, когда вы вернетесь к нему, чтобы остановить и изучить его.

Возьмите объявление переменной секундомера вне метода.

Вы создаете новый секундомер каждый раз, когда вызывается этот метод, но похоже, что он должен быть постоянным между вызовами метода.

    if(time == true)
    {
        stopwatch.Start();
    }
    if (time == false) 
    {
        stopwatch.Stop(); 
        ...
    }

Если time Это правда, вы только когда запускаете секундомер.

Если это неверно, вы никогда не начнете.

Лучшая структура будет:

if(time)
{
    stopwatch.Start();
}

... //code to measure here

if (time) 
{
    stopwatch.Stop(); 
    // log elapsed time
}

Замечания:

Если у вас есть логический тип, вы не можете сравнить его с true или же false, Просто используйте его напрямую, и если вы хотите инвертировать его, просто используйте !,

Как насчет использования:

var startTime = DateTime.Now;

... your code

var elapsed = DateTime.Now - startTime;

Вам нужно использовать timeSpan.TotalMinutes вместо timestamp.Minutes. Обратитесь к документации по времени

Другие вопросы по тегам