我意识到在某些sinon.spy
代码中,我们正在打开频道,有些会被WPF
方法关闭,有些则不会在实践中关闭。
我想知道的是:
每次关闭表单并完成其功能后,都需要调用channel.close()
。
如果有必要,那么通过这样做,我们是否可以防止资源泄漏
什么是资源泄漏?记忆用完了吗?
感谢。
答案 0 :(得分:2)
这是一个很好的做法。以下内容取自here
对于您的应用创建的大多数对象,您可以信赖 .NET Framework的垃圾收集器来处理内存管理。
但是,当您创建包含非托管资源的对象时, 您必须在完成使用后明确释放这些资源 在你的应用程序中最常见的非托管资源类型是对象 包装操作系统资源,如文件,窗口,网络 连接或数据库连接。
虽然垃圾收集器能够跟踪垃圾的生命周期 封装非托管资源的对象,它不知道如何 释放并清理非托管资源。
如果您的类型使用非托管资源,则应执行以下操作:
实施配置模式。这要求您提供IDisposable.Dispose实现以启用确定性发布 非托管资源。您的类型的消费者在调用时调用Dispose 不再需要对象(以及它使用的资源)。处理 方法立即释放非托管资源。
- 醇>
如果您的类型的消费者忘记调用Dispose,请提供释放的非托管资源。
有两种方法可以实现上述选项2:
使用安全句柄来包装非托管资源。这是推荐的技术。安全手柄来自于 System.Runtime.InteropServices.SafeHandle类并包含一个健壮的 完成方法。当您使用安全句柄时,您只需实现 IDisisposable接口并调用您的安全句柄的Dispose方法 你的IDisposable.Dispose实现。安全手柄的终结器 如果是Dispose方法,垃圾收集器会自动调用它 没有被召唤。
- 醇>
重写Object.Finalize方法。最终确定可以在消费者的时候实现非托管资源的非确定性释放 一个类型无法调用IDisposable.Dispose来处置它们 确定性。但是,因为对象最终化可以是一个 复杂且容易出错的操作,我们建议您使用安全 处理而不是提供自己的终结器。
答案 1 :(得分:2)
每次在表单之后都需要调用channel.close() 关闭,渠道完成其功能。
您应该始终尝试处理您的客户端频道。这里讨论了正确的方法:What is the best workaround for the WCF client `using` block issue?
如果有必要,那么通过这样做,我们是否会阻止 资源泄漏
是
什么是资源泄漏?记忆用完了吗?
是的,这是正确的。资源未正确处理,因此在卸载appdomain之前,它将保留在内存中。