在长时间运行的循环中处理超时

问题描述:

我有一个应该在给定时间内执行的方法,否则应该抛出'超时'异常。基本上它有一个长时间的运行循环。在循环的每次传球计算超时似乎昂贵:在长时间运行的循环中处理超时

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

只能定期检查吗?例如:

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