Async和CancellationTokens / CancellationTokenSource memory-issue

时间:2012-03-15 10:08:26

标签: asynchronous memory-leaks f# mailboxprocessor cancellationtokensource

我还在寻找记忆漏洞,我发现了以下内容:

我有很多来自F#的default-CancellationTokenSource(Async-Workflows)的System.Threading.CancellationCallbackInfo-Objects的实例。

如果你自己声明一个Source并在MailboxProcessor中使用它来跨越孩子或任务,问题就会变得更糟。

似乎GC无法收集那些跨越的任务/工作流,因为CancellationTokenSource持有这样的引用: enter image description here

大多数CancellationCallbackInfo-Objects都获得Gen2 - 令人难以置信,因为我只是在MailboxProcessors-“loop”工作流程中使用本地引用...

这是一个已知问题,是否有解决方案/解决方法?

现在我停止使用Cancellation-support和线程ManualResetEvents通过这个代码......一点都不好:(

1 个答案:

答案 0 :(得分:3)

如果您使用StartChild,则会出现泄漏(另请参阅this),该修补程序将在下一版本中修复。您可以使用StartAsTask

解决此问题

最好使用您自己的CancellationTokenSource来创建令牌,并将令牌显式传递给F#asyncs,这样您就可以按照自己的条件Dispose CTS。

(如果您发现不同的泄漏不涉及StartChild,我们会喜欢一个小型的复制品,所以我们可以解决它!)