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

C# 在长时间运行的循环中处理超时,c#,C#,我有一个应该在给定时间内执行的方法,或者它应该抛出“Timeout”异常。基本上,它有一个长的运行循环。在每次循环中计算超时似乎很昂贵: private void DoSomethingGood(int timeoutSeconds) { var startTime=DateTime.Now; int count=100000000; //some big number for(int i=0;i<count;i++) { //code t

我有一个应该在给定时间内执行的方法,或者它应该抛出“Timeout”异常。基本上,它有一个长的运行循环。在每次循环中计算超时似乎很昂贵:

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*/

    }
}
private void DoSomethingGood(int timeoutSeconds)
{
var startTime=DateTime.Now;
int count=100000000;//一些大数字
for(int i=0;i=timeoutSeconds)
{
抛出新的TimeoutException(“超时”);
}
/*这里有更多的代码*/
}
}
(在没有其他代码的情况下调用上述方法,本身需要2秒以上的时间,这主要是由于DateTime.Now语句)

有人能提出更好的方法吗


我只需要+-几毫秒就可以了。

只需要定期检查吗?例如:

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

或者根据需要通知超时的速度调整为
1000
10000
等。

仅定期进行检查?例如:

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

或者调整为
1000
10000
等,这取决于它需要通知超时的速度。

注意事项的可能重复:您可能希望使用
UtcNow
而不是
现在
(在这两种情况下)-否则,当时区/夏令时更改时,它可能会失败。DateTime.UtcNow将为您提供比DateTime.now更好的性能,因为它不需要将时间转换为本地时区。这可能会解决您的性能问题。@Falaque呃,是的,它会失败。如果循环刚好在夏令时之前开始,您可能(取决于更改的方向)在一个小时内根本没有检测到超时(等),或者可能过早地错误地检测到它。@Falaque correct;只要没有人改变实际的系统时钟本身(这与时区和DST设置无关),可能会重复注意:您可能希望使用
UtcNow
,而不是
Now
(在这两种情况下)-否则,当时区/夏令时更改时,它可能会失败。DateTime.UtcNow将为您提供比DateTime.now更好的性能,因为它不需要将时间转换为本地时区。这可能会解决您的性能问题。@Falaque呃,是的,它会失败。如果循环刚好在夏令时之前开始,您可能(取决于更改的方向)在一个小时内根本没有检测到超时(等),或者可能过早地错误地检测到它。@Falaque correct;只要没有人更改实际系统时钟本身(这与时区和DST设置等无关)注意:您还可以通过
var timeout=startTime.AddSeconds(timeoutSeconds)预先计算超时来提高测试性能只需检查
if(DateTime.[Utc]Now>=timeout)
-但这可能不值得。检查超时本身需要花费很多时间。@Falaque因此您可以根据上述情况减少检查次数。注意:您还可以通过
var timeout=startTime.AddSeconds预先计算超时来提高测试性能(timeoutSeconds);
只需检查
if(DateTime。[Utc]Now>=timeout)
-但这可能不值得。检查超时本身花费了很多时间。@Falaque因此,根据上述情况,检查超时的频率会降低。