Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不使用线程超时?极大极小树的迭代深化_C#_Time - Fatal编程技术网

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;}