gpt4 book ai didi

.net - 不调用 Delegate.EndInvoke 会导致内存泄漏......一个神话?

转载 作者:行者123 更新时间:2023-12-03 21:49:41 26 4
gpt4 key购买 nike

围绕这个已经有很多讨论,每个人都倾向于同意你应该总是调用 Delegate.EndInvoke 来防止内存泄漏(甚至 Jon Skeet 也说过!)。

我总是毫无疑问地遵循这个准则,但最近我实现了自己的 AsyncResult 类,发现唯一可能泄漏的资源是 AsyncWaitHandle。

(实际上它并没有真正泄漏,因为 WaitHandle 使用的 native 资源被封装在具有 Finalizer 的 SafeHandle 中,但它会给垃圾收集器的 finalize 队列增加压力。即使如此,AsyncResult 的良好实现将仅根据需要初始化 AsyncWaitHandle...)

知道是否有泄漏的最好方法就是尝试一下:

Action a = delegate { };
while (true)
a.BeginInvoke(null, null);

我运行了一段时间,内存保持在 9-20 MB 之间。

让我们比较一下何时调用 Delegate.EndInvoke:
Action a = delegate { };
while (true)
a.BeginInvoke(ar => a.EndInvoke(ar), null);

这次测试,内存在9-30MG之间,很奇怪吧? (可能是因为有AsyncCallback的时候执行时间会比较长,所以ThreadPool中排队的delegate会比较多)

你怎么看……“神话破灭”?

附言ThreadPool.QueueUserWorkItem 比 Delegate.BeginInvoke 效率高一百,最好将它用于触发和忘记调用。

最佳答案

它当前是否泄漏内存不是您应该依赖的。框架团队将来可能会以可能导致泄漏的方式进行更改,并且由于官方政策是“您必须调用 EndInvoke”,因此它是“设计使然”。

你真的想冒险,因为你选择依赖观察到的行为而不是记录的需求,你的应用程序会在 future 的某个时候突然开始泄漏内存吗?

关于.net - 不调用 Delegate.EndInvoke 会导致内存泄漏......一个神话?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1774202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com