如何在 timeLimit 之后使未来的计算超时?

Posted

技术标签:

【中文标题】如何在 timeLimit 之后使未来的计算超时?【英文标题】:How to timeout a future computation after a timeLimit? 【发布时间】:2016-02-27 02:23:42 【问题描述】:

如下定义 Future 时:

Future<HttpRequest> httpRequest =  HttpRequest.request(url,
      method: method, requestHeaders: requestHeaders);

我想在 5 秒后处理超时。我正在编写这样的代码:

httpRequest.timeout(const Duration (seconds:5),onTimeout : _onTimeout());

我的超时功能在哪里:

_onTimeout() => print("Time Out occurs");

根据Future timeout() method documentation,如果省略onTimeout,超时将导致返回的future以TimeoutException完成。但是使用我的代码,我的方法 _onTimeout() 被正确调用(但立即,而不是 5 秒后),我总是得到一个

TimeException after 5 seconds...(TimeoutException after 0:00:05.000000: Future not completed)

我错过了什么吗?

【问题讨论】:

【参考方案1】:

改变这一行

httpRequest.timeout(const Duration (seconds:5),onTimeout : _onTimeout());

httpRequest.timeout(const Duration (seconds:5),onTimeout : () => _onTimeout());

或者只是传递对函数的引用(不带()

httpRequest.timeout(const Duration (seconds:5),onTimeout : _onTimeout);

这样调用_onTimeout() 的闭包将被传递给timeout()。 在前面的代码中,_onTimeout() 调用的结果将被传递给timeout()

【讨论】:

也可以是onTimeout : _onTimeout(不带括号)。【参考方案2】:
Future.await[_doSome].then((data)
    print(data);
    ).timeout(Duration(seconds: 10));

【讨论】:

太棒了。我不知道超时是内置在 Future 中的。谢谢!【参考方案3】:

使用异步/等待风格。您可以将.timeout 添加到您正在等待的任何Future

final result = await InternetAddress
   .lookup('example.com')
   .timeout(
      Duration(seconds: 10),
      onTimeout: () => throw TimeoutException('Can\'t connect in 10 seconds.'),
    );

【讨论】:

以上是关于如何在 timeLimit 之后使未来的计算超时?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算活动的javascript超时?

如何计算 iOS 中网络连接测试的有效负载大小和超时长度?

如何解决会话超时问题?

如何使线程超时

如何设置 Pyomo 求解器超时?

如何使 ASP.NET MVC 登录用户超时?