实现外部调用的超时

本文关键字:超时 外部调用 实现 | 更新日期: 2023-09-27 18:02:29

我理解秒表可以用来保持循环迭代,直到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循环的条件,直到响应回来?如果是这样,如果在返回响应之前计时器已经过期,那么中止外部调用的合适解决方案是什么?

实现外部调用的超时

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