0

我仍在寻找内存泄漏,我注意到以下内容:

我有很多来自 F# 的默认取消令牌源(异步工作流)的 System.Threading.CancellationCallbackInfo-Objects 的实时实例。

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

似乎 GC 无法收集那些跨越的任务/工作流,因为 CancellationTokenSource 持有这样的引用: 在此处输入图像描述

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

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

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

4

1 回答 1

4

如果您正在使用StartChild,则那里存在泄漏(另请参见this),这将在下一个版本中修复。您可以使用StartAsTask.

使用您自己CancellationTokenSource的令牌创建令牌并将令牌显式传递给 F# asyncs 是一种很好的做法,这样您就可以Dispose按照自己的方式使用 CTS。

(如果您看到不涉及的其他泄漏StartChild,我们会喜欢一个小的复制品,所以我们可以修复它!)

于 2012-03-15T17:37:55.173 回答