2013-03-26 98 views
2

我有一個應該在給定時間內執行的方法,否則應該拋出'超時'異常。基本上它有一個長時間的運行循環。在循環的每次傳球計算超時似乎昂貴:在長時間運行的循環中處理超時

private void DoSomethingGood(int timeoutSeconds) 
{ 
    var startTime=DateTime.Now; 
    int count=100000000; //some big number 

    for(int i=0;i<count;i++) 
    { 
     //code to to take care of timeout. 
     var ellapsedSeconds =(DateTime.Now-startTime).TotalSeconds; 
     if(ellapsedSeconds>=timeoutSeconds) 
     { 
      throw new TimeoutException("Timeout"); 
     } 

     /*some more code here*/ 

    } 
} 

(調用上面沒有其他代碼,本身正在超過2秒,很大程度上是由於DateTime.Now聲明方法)

有人能提出一個更好這樣做的方法?

我很好+ -few-milliseconds。

+0

[.net構造for while循環超時]的重複可能性(http://stackoverflow.com/questions/6629219/net-construct-for-while-loop-with-timeout) – jbabey 2013-03-26 12:14:36

+0

爲什麼不使用build-in 'System.Timers.Timer'? – 2013-03-26 12:15:58

+0

您的DateTime.Now不需要2秒鐘。如果是這樣,你應該檢查你的電腦。 – Peter 2013-03-26 12:16:07

回答

4

只能定期檢查嗎?例如:

if((i % 100) == 0) { /* check for timeout */ } 

或調整到100010000等根據需要多快的速度發現超時。

+0

注意:您還可以通過var timeout = startTime.AddSeconds(timeoutSeconds)預先計算超時值來提高測試性能。 '只是檢查'if(DateTime。[Utc] Now> = timeout)' - 但它可能不值得。 – 2013-03-26 12:22:06

+0

事情正在檢查超時本身花費了很多時間。 – Falaque 2013-03-26 12:25:38

+0

@Falaque因此您不太經常檢查它,因爲以上所述。 – 2013-03-26 12:26:04