我还在寻找记忆漏洞,我发现了以下内容:
我有很多来自F#的default-CancellationTokenSource(Async-Workflows)的System.Threading.CancellationCallbackInfo-Objects的实例。
如果你自己声明一个Source并在MailboxProcessor中使用它来跨越孩子或任务,问题就会变得更糟。
似乎GC无法收集那些跨越的任务/工作流,因为CancellationTokenSource持有这样的引用:
大多数CancellationCallbackInfo-Objects都获得Gen2 - 令人难以置信,因为我只是在MailboxProcessors-“loop”工作流程中使用本地引用...
这是一个已知问题,是否有解决方案/解决方法?
现在我停止使用Cancellation-support和线程ManualResetEvents通过这个代码......一点都不好:(
答案 0 :(得分:3)
如果您使用StartChild
,则会出现泄漏(另请参阅this),该修补程序将在下一版本中修复。您可以使用StartAsTask
。
最好使用您自己的CancellationTokenSource
来创建令牌,并将令牌显式传递给F#asyncs,这样您就可以按照自己的条件Dispose
CTS。
(如果您发现不同的泄漏不涉及StartChild
,我们会喜欢一个小型的复制品,所以我们可以解决它!)