据我所知,秒表对于循环迭代非常有用,直到X时间过去为止:
void DoWork()
{
TimeSpan maxDuration = TimeSpan.FromMinutes(3);
Stopwatch sw = Stopwatch.StartNew();
while (sw.Elapsed < maxDuration)
{
// do some work
}
}
但是,如果该循环包含一个需要很长时间的动作(例如对外部资源的调用),那么循环是否会等到响应返回之后,再次迭代并看到StopWatch已经过去之后呢?
void DoWork()
{
TimeSpan maxDuration = TimeSpan.FromMinutes(3);
Stopwatch sw = Stopwatch.StartNew();
while (sw.Elapsed < maxDuration)
{
var response = CallExternalResourceWhichTakes5Minutes()
}
}
我是否正确,我们不会再次检查while循环的情况,直到响应回来?如果是这样,如果在返回响应之前计时器过去,那么中止外部调用的适当解决方案是什么?
答案 0 :(得分:3)
Am I correct in that we won't check the while loop's condition again until the response has come back?
这很明显,因为您正在使用同步调用方法。
what would be an appropriate solution to abort the external call if the timer elapses before a response is returned
执行此操作的适当方式之一是将Task与Task.Wait Method (TimeSpan)
一起使用 var myTask= Task.Factory.StartNew(()=>CallExternalResourceWhichTakes5Minutes());
在这里你可以设置超时,5分钟后的结果将被忽略
Task.Wait(myTask,new TimeSpan(0,5,0));