2012-08-28 15 views
0

我聲明瞭以下變量:有沒有更好的方式讓我在C#中定時事件?

private Stopwatch stopwatch; 
    private long t1, t2, t3, t4, t5; 

,我使用秒錶這樣的:

  try { 
      stopwatch = Stopwatch.StartNew(); 
      get1(); 
      t1 = stopwatch.ElapsedMilliseconds; 
      anotherGet(); 
      t2 = stopwatch.ElapsedMilliseconds; 
      vm.Detail = anotherAnotherGet(); 
      t3 = stopwatch.ElapsedMilliseconds; 
     } catch (Exception e) { 
      log(e); 
     } finally { 
      Stopwatch.Stop(); 
      if (vm.Detail.Count() > 0) { 
       return PartialView("Details", vm); 
      } else { 
       return Content("No records found"); 
      } 
     } 

有沒有更好的辦法,我可以存儲我的時間,而不是在一個名爲1-5 多頭。問題是在 代碼的某些區域我可能只需要t1,而在其他區域我可能需要多於5個時間點的 。

我正在使用終止停止。這是否正確的方式來 做到這一點?

+1

你應該使用'vm .Detail.Any()'而不是'vm.Detail.Count()> 0'。 – dlev

+0

非常感謝您的建議。任何() – Angela

回答

2

您可以使用字典,以便您可以將值存儲在名稱/鍵下。

請注意,將值添加到集合可能會花費一些時間,可能會影響您的測量。

所以,你可能想這樣做:

stopwatch = Stopwatch.StartNew(); 
get1(); 
stopwatch.Stop(); 
timings.Add("t1", stopwatch.ElapsedMilliseconds); 
stopwatch.Start(); 

的最後是OK

1

只需使用一個List<long>存儲多次,因爲你需要:

var times = new List<long>(); 
stopwatch = Stopwatch.StartNew(); 
get1(); 
times.Add(stopwatch.ElapsedMilliseconds); 
anotherGet(); 
times.Add(stopwatch.ElapsedMilliseconds); 
vm.Detail = anotherAnotherGet(); 
times.Add(stopwatch.ElapsedMilliseconds); 

把你清理邏輯裏面finally並沒有真正做任何事情,在這裏,因爲之前只是你無條件地捕捉和吞食所有類型的異常,這是非常非常糟糕的

+0

感謝Jon。我只在報告代碼中這樣做,但我同意我錯過了處理異常,並且如果它落入異常塊中,我將添加一些代碼以執行某些操作。我一直在想,即使有什麼東西掉進了捕捉器,我總是會被執行,所以我停止了秒錶。我的想法錯了嗎? – Angela

+0

@Angela:不,那部分是非常正確的。很可能你應該在'finally'裏面停止計時器,並在'finally'後面返回內容(如果沒有拋出異常,只返回內容)。 – Jon

1

你可以將它們存儲在List<long>

List<long> times = new List<long>(); 

而且他們根本

times.Add(stopwatch.ElapsedMilliseconds); 
+0

我可能會在不同的地方運行時間。有沒有一種方法可以將我的代碼聲明爲private,然後在每次運行時清除列表? – Angela

相關問題