Как сделать время истекшим методом?
Мне нужен метод, который дал бы мне время, затраченное на процесс. Я вызываю его в начале процесса и вызываю его снова в конце процесса, а метод 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. Обратитесь к документации по времени