.NET 4.5 和 Async CTP 4.0 中包含await的流程可能由于各种原因而卡住,例如远程客户端没有响应。当然,WaitForAny,当我们也等待一些超时任务时,显然是恢复高层流的一个解决方案。尽管如此,这并不能解决所有可能的问题。
我有以下问题:
永远不会返回的等待上下文会发生什么?我知道这会造成内存泄漏。我对吗?
如何在调试器中或使用相应的 API 检查应用程序中存在多少悬空的“等待者”?
是否可以在全球范围内枚举它们?
如果 3. 正确,是否可以强制取消这些*await *s 的任务(即清理)?
注意:在问题 4 中,我没有询问在显式任务创建期间要使用的取消项目。我的意思是间接创建任务的情况:
async Task<bool> SomeTask()
{
await Something();
...
return true;
}
这个问题的动机:
- 试图避免内存泄漏
- 试图在涉及取消令牌的情况下使代码复杂化
- 在许多情况下,每个低级任务的超时时间是事先不知道的,但高级流程可以使用刚刚恢复的方法:“我们被卡住了?没关系,只需清理并让我们重新开始”。