我们是否需要处置资源以及​​为什么我们需要在WCF中

时间:2016-03-10 09:38:43

标签: c# wcf

我意识到在某些sinon.spy代码中,我们正在打开频道,有些会被WPF方法关闭,有些则不会在实践中关闭。

我想知道的是:

  1. 每次关闭表单并完成其功能后,都需要调用channel.close()

  2. 如果有必要,那么通过这样做,我们是否可以防止资源泄漏

  3. 什么是资源泄漏?记忆用完了吗?

  4. 感谢。

2 个答案:

答案 0 :(得分:2)

这是一个很好的做法。以下内容取自here

  

对于您的应用创建的大多数对象,您可以信赖   .NET Framework的垃圾收集器来处理内存管理。

     

但是,当您创建包含非托管资源的对象时,   您必须在完成使用后明确释放这些资源   在你的应用程序中最常见的非托管资源类型是对象   包装操作系统资源,如文件,窗口,网络   连接或数据库连接。

     

虽然垃圾收集器能够跟踪垃圾的生命周期   封装非托管资源的对象,它不知道如何   释放并清理非托管资源。

     

如果您的类型使用非托管资源,则应执行以下操作:

     
      
  1. 实施配置模式。这要求您提供IDisposable.Dispose实现以启用确定性发布   非托管资源。您的类型的消费者在调用时调用Dispose   不再需要对象(以及它使用的资源)。处理   方法立即释放非托管资源。

  2.   
  3. 如果您的类型的消费者忘记调用Dispose,请提供释放的非托管资源。

  4.         

    有两种方法可以实现上述选项2:

         
        
    1. 使用安全句柄来包装非托管资源。这是推荐的技术。安全手柄来自于   System.Runtime.InteropServices.SafeHandle类并包含一个健壮的   完成方法。当您使用安全句柄时,您只需实现   IDisisposable接口并调用您的安全句柄的Dispose方法   你的IDisposable.Dispose实现。安全手柄的终结器   如果是Dispose方法,垃圾收集器会自动调用它   没有被召唤。

    2.   
    3. 重写Object.Finalize方法。最终确定可以在消费者的时候实现非托管资源的非确定性释放   一个类型无法调用IDisposable.Dispose来处置它们   确定性。但是,因为对象最终化可以是一个   复杂且容易出错的操作,我们建议您使用安全   处理而不是提供自己的终结器。

    4.   

答案 1 :(得分:2)

  

每次在表单之后都需要调用channel.close()   关闭,渠道完成其功能。

您应该始终尝试处理您的客户端频道。这里讨论了正确的方法:What is the best workaround for the WCF client `using` block issue?

  

如果有必要,那么通过这样做,我们是否会阻止   资源泄漏

  

什么是资源泄漏?记忆用完了吗?

是的,这是正确的。资源未正确处理,因此在卸载appdomain之前,它将保留在内存中。