2011-05-05 129 views
0

我需要一種方法,給我一段時間過去的時間。我在開始過程中調用它,並在完成過程中再次調用它,並且該方法會打印經過的總時間。如何讓時間流逝的方法?

這是我的方法,但總是在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); 

     }   
    } 

回答

1

您的stopwatch變量是本地的。當你第二次調用函數時,它會再次被初始化。

您需要將聲明上移到課程級別。

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

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

您每次調用此方法時都會創建一個新的秒錶,但它看起來應該在方法調用之間保持不變。

0

怎麼樣使用:

var startTime = DateTime.Now; 

... your code 

var elapsed = DateTime.Now - startTime; 
+4

日期時間是[不是一個好方法](http://stackoverflow.com/questions/2923283/stopwatch-vs-using-system-datetime-now-for-timing-events/2923349#2923349)的計算經過時間。 – 2011-05-05 15:59:20

+0

@Brad Christie:感謝您的鏈接。好點子。在這種情況下,OP似乎只會將已用時間用於用戶信息,並且可能足夠精確。但是,再次感謝您指出這一點。 – DanielB 2011-05-05 16:06:08

-1

您需要使用timeSpan.TotalMinutes代替timestamp.Minutes。請參考timespan文檔

2

看看你在哪裏聲明stopwatch;這是一個局部變量。這意味着你正在創建和使用兩個不同的秒錶;第一個是在您用「true」參數調用方法時啓動的,然後在方法結束並且變量超出範圍時處理。第二個是宣佈的,從未開始,然後對其時間進行檢查和記錄。

要解決該問題,請爲秒錶聲明一個實例變量(「字段」)。只要對象在附近,這將保持在範圍內,這意味着它將在方法結束後繼續運行,並且在您返回時停止並檢查它時仍然是相同的實例。

1

將方法外的秒錶變量聲明。

+0

這是什麼類型的變量?或者我怎樣才能在外面寫變量? ...我正在考慮一些類似.. – ale 2011-05-05 16:01:44

+0

請參閱[@Blorgbeard](http://stackoverflow.com/questions/5900686/how-make-time-elapsed-method/5900773#5900773)答案。 – 2011-05-05 16:03:22

+0

是的,我明白了。謝謝 – ale 2011-05-05 16:05:13

0
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 
} 

注:

如果你有一個布爾類型,你比較它truefalse。直接使用它,如果你想反轉,只需使用!