如何在 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 之后使未来的计算超时?的主要内容,如果未能解决你的问题,请参考以下文章