我正在进行一些计算,如果运行时间太长,我就需要设置一个超时时间。我可能会设置5秒的超时时间,并在我的代码中定期轮询。实际的代码更加复杂,有很多递归和分散在许多类中,但这应该可以给出它是如何工作的一个大致的概念。基本上,每当某个东西调用递归或执行可能需要时间的操作时,它都会调用AssertTimeout()。
private DateTime endTime;
public void PerpareTimeout(int timeoutMilliseconds)
{
endTime = DateTime.UtcNow.AddMilliseconds(timeoutMilliseconds);
}
public void AssertTimeout()
{
if (DateTime.UtcNow > endTime)
throw new TimeoutException();
}
public void DoWork1()
{
foreach (var item in workItems)
{
AssertTimeout();
DoWork2(item)
}
}
public void DoWork2(WorkItem item)
{
foreach (var item in workItems)
{
AssertTimeout();
// ...
}
}
当我附加了调试器并暂停执行时,问题就出现了。我希望在暂停的时间内能够禁用超时。因此,如果它运行了2秒钟,我触发了断点并等待了5分钟,然后继续执行,它会在恢复执行后再运行3秒钟,然后超时。
我可以使用类似这样的方法:
public void PrepareTimeout(int timeoutMilliseconds)
{
if (System.Diagnostics.Debugger.IsDebuggerAttached)
endTime = DateTime.MaxValue;
else
endTime = DateTime.UtcNow.AddMilliseconds(timeoutMilliseconds);
}
但是在调试环境下运行程序时,这基本上相当于给予无限超时时间,而我希望在不暂停程序的情况下正常超时。
有没有办法测量经过的时间,而不计算调试器暂停的时间?