如何在不使用线程的情况下限制迭代加深搜索的执行时间?
目前我使用这个简单的实现,但效率不高,有时甚至不会在给定的时间范围内终止..
timer.Start();
best = doSearch();
timer.Stop();
dpuble time = timer.Duration;
while (time*1000 < 400)
{
timer.Start();
best = doSearch();
timer.Stop();
time += timer.Duration;
}
答案 0 :(得分:2)
如果您想避免线程化,则需要将时间戳传递到doSearch()
方法中。它可以(定期)检查当前时间,如果持续时间超过某个阈值,则提出异常或返回失败的案例。
答案 1 :(得分:0)
您想如何终止执行?你想退出程序,还是只是停止搜索?如果你没有破坏你的过程,你可以这样做:
var timer = new Timer(new TimeSpan(0, 0, 400));
timer.Elapsed += { throw new Exception("Time's up!"); }
timer.Start();
doSearch();
timer.Stop();
但我认为你想要更合理的东西。在这种情况下,您可能必须在doSearch
内执行此操作。我假设该方法是迭代的或递归的,在这种情况下,您可以将开始时间存储在实例变量中,然后检查迭代/递归中众所周知的点的已用时间。例如:
private DateTime _start;
private TimeSpan _maxTime = new TimeSpan(0, 0, 400);
public void TimedSearch()
{
_start = DateTime.Now;
DoSearch();
}
public void DoSearch()
{
while (notFound)
{
if (DateTime.Now - _start > _maxTime)
return;
// search code
}
}