Как сделать время истекшим методом? - PullRequest
0 голосов
/ 05 мая 2011

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

2 голосов
/ 05 мая 2011

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

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

1 голос
/ 05 мая 2011

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

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

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

public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions)
{
   ... etc
1 голос
/ 05 мая 2011

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

1 голос
/ 05 мая 2011

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

0 голосов
/ 05 мая 2011
    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. Просто используйте его напрямую, и если вы хотите инвертировать его, просто используйте !.

0 голосов
/ 05 мая 2011

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

0 голосов
/ 05 мая 2011

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

var startTime = DateTime.Now;

... your code

var elapsed = DateTime.Now - startTime;
...