Asynchronous Dart:io如何清理超时?

Asynchronous Dart:io如何清理超时?,asynchronous,dart,timeout,async-await,future,Asynchronous,Dart,Timeout,Async Await,Future,假设我们使用配置了超时的HTTP包从dart:io应用程序发出HTTP请求: dynamic getSomething(String url) async { try { var response = await http.get(url).timeout(new Duration(seconds: 30)); return JSON.decode(response.body); } catch (_) { return null; } } 这里有两个未来,

假设我们使用配置了超时的HTTP包从dart:io应用程序发出HTTP请求:

dynamic getSomething(String url) async {
  try {
    var response = await http.get(url).timeout(new Duration(seconds: 30));
    return JSON.decode(response.body);
  } catch (_) {
    return null;
  }
}
这里有两个未来,一个由http.get(请求未来)生成,另一个由Future.timeout(超时未来)生成。如果未来的请求完成, 它的值被传递到超时未来,超时未来又被完成。那很好

但是,如果http.get未在30秒内完成,则未来超时将完成并引发TimeoutException。未来的请求会发生什么? 当然,存在一些与未来请求相关联的状态和内存分配,这些状态和内存分配不是通过运行未来超时来特别清理的。更糟糕的是, 如果请求在超时后完成,该代码仍将执行。未来超时是否有责任明确取消请求- 在这种情况下,这是不可能的,因为它被埋在包中——或者必须使用其他机制吗


更一般地说,一个从未完成的未来会最终清除其状态和内存吗?还是它会永远挂起?

一个未来会在没有引用它时被垃圾收集,就像任何其他变量一样。未来变量没有本质上的不同。例如,它们不是操作系统构造

在http示例中,超时未来与原始未来链接,因此如果原始未来完成,则超时未来也将完成。在相反的情况下,在超时触发的情况下,http操作将保留对原始未来的引用(保留对超时未来的引用),直到http操作完成。因此,未来可能泄漏的唯一方式是如果http请求从未返回,但在这一点上,您正在泄漏http连接,并且您有比泄漏几个未来更大的问题


请注意,未来超时完成并不意味着存在错误。错误表现不同。错误将导致将来调用catchError()或调用您的回调。

看起来没有进行清理。我想超时回调必须处理这个问题。
HttpRequest