C# 不使用线程超时?极大极小树的迭代深化
如何在不使用线程的情况下限制迭代深化搜索的执行时间 目前我使用这个简单的实现,但它效率不高,有时甚至没有在给定的时间范围内终止C# 不使用线程超时?极大极小树的迭代深化,c#,time,C#,Time,如何在不使用线程的情况下限制迭代深化搜索的执行时间 目前我使用这个简单的实现,但它效率不高,有时甚至没有在给定的时间范围内终止 timer.Start(); best = doSearch(); timer.Stop(); dpuble time = timer.Duration; while (time*1000 < 400) { timer.Start(); best = doSearch(); timer.Stop(); time += timer.Durat
timer.Start();
best = doSearch();
timer.Stop();
dpuble time = timer.Duration;
while (time*1000 < 400)
{
timer.Start();
best = doSearch();
timer.Stop();
time += timer.Duration;
}
timer.Start();
最佳=doSearch();
timer.Stop();
dpuble time=计时器。持续时间;
同时(时间*1000<400)
{
timer.Start();
最佳=doSearch();
timer.Stop();
时间+=计时器持续时间;
}
如果要避免线程,需要将时间戳传递到doSearch()
方法中。它可以(定期)检查当前时间,如果持续时间超过某个阈值,则引发异常或返回失败案例。您希望如何终止执行?您想退出程序,还是停止搜索?如果您同意销毁流程,可以这样做:
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
}
}
为什么不想使用线程呢?这两种方法可以组合成我认为最好的解决方案
private volatile bool timesUp
可以通过timer.appeased
方法设置为true,并且DoSearch()
可以定期检查此值。如何使用timer.appeased设置timesUp?@BeatMe:timer.appeased+={this.timesUp=true;}代码>