Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我们需要处理资源吗?为什么我们需要WCF_C#_Wcf - Fatal编程技术网

C# 我们需要处理资源吗?为什么我们需要WCF

C# 我们需要处理资源吗?为什么我们需要WCF,c#,wcf,C#,Wcf,我意识到,在一些WPF代码中,我们正在打开通道,一些通道将通过channel.close()关闭(方法)关闭,而在实践中,有些则不是 我想知道的是: 每次窗体关闭且通道完成其功能后,是否需要调用通道.close() 如果有必要,那么通过实践,我们是否可以防止资源泄漏 什么是资源泄漏?内存用完了吗 谢谢。这是一个很好的练习。下表摘自 对于应用程序创建的大多数对象,您可以依赖 NET Framework的垃圾收集器来处理内存管理 但是,当您创建包含非托管资源的对象时, 在使用完这些资源后,必须显式释

我意识到,在一些
WPF
代码中,我们正在打开通道,一些通道将通过
channel.close()关闭(
方法)关闭,而在实践中,有些则不是

我想知道的是:

  • 每次窗体关闭且通道完成其功能后,是否需要调用
    通道.close()

  • 如果有必要,那么通过实践,我们是否可以防止资源泄漏

  • 什么是资源泄漏?内存用完了吗


  • 谢谢。

    这是一个很好的练习。下表摘自

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

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

    尽管垃圾收集器能够跟踪 对象封装非托管资源,它不知道如何 释放并清理非托管资源

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

  • 实现dispose模式。这要求您提供IDisposable.Dispose实现以启用确定性版本 非托管资源的管理。当 对象(及其使用的资源)不再需要。处置 方法立即释放非托管资源

  • 提供在您的类型的使用者忘记调用Dispose时释放的非托管资源

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

  • 使用安全句柄包装非托管资源。这是推荐的技术。安全句柄是从 System.Runtime.InteropServices.SafeHandle类,并包含一个健壮的 最后确定方法。当您使用安全句柄时,只需实现 IDisposable接口,并在中调用安全句柄的Dispose方法 您的IDisposable.Dispose实现。安全句柄的终结器 如果垃圾收集器的Dispose方法 不叫

  • 重写Object.Finalize方法。终结允许非托管资源的非确定性释放,当 类型无法调用IDisposable.Dispose以处置它们 决定性地。但是,因为对象终结可以是 操作复杂且容易出错,建议您使用安全的 句柄,而不是提供自己的终结器


  • 这是一个很好的做法。下表摘自

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

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

    尽管垃圾收集器能够跟踪 对象封装非托管资源,它不知道如何 释放并清理非托管资源

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

  • 实现dispose模式。这要求您提供IDisposable.Dispose实现以启用确定性版本 非托管资源的管理。当 对象(及其使用的资源)不再需要。处置 方法立即释放非托管资源

  • 提供在您的类型的使用者忘记调用Dispose时释放的非托管资源

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

  • 使用安全句柄包装非托管资源。这是推荐的技术。安全句柄是从 System.Runtime.InteropServices.SafeHandle类,并包含一个健壮的 最后确定方法。当您使用安全句柄时,只需实现 IDisposable接口,并在中调用安全句柄的Dispose方法 您的IDisposable.Dispose实现。安全句柄的终结器 如果垃圾收集器的Dispose方法 不叫

  • 重写Object.Finalize方法。终结允许非托管资源的非确定性释放,当 类型无法调用IDisposable.Dispose以处置它们 决定性地。但是,因为对象终结可以是 操作复杂且容易出错,建议您使用安全的 句柄,而不是提供自己的终结器

  • 是否有必要每次在表单之后调用channel.close() 关闭,通道完成其功能

    您应该始终尝试处理您的客户端通道。这里详细讨论了正确的方法:

    如果有必要的话,那么通过这样的练习,我们是否可以防止 资源泄漏

    什么是资源泄漏?内存用完了吗

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

    是否有必要每次在表单之后调用channel.close() 关闭,通道完成其功能

    您应该始终尝试处理您的客户端通道。这里详细讨论了正确的方法:

    如果有必要的话,那么通过这样的练习,我们是否在预防