관리되지 않는 리소스 정리Cleaning Up Unmanaged Resources

사용자 앱에서 만드는 대부분의 개체에 대해 .NET의 가비지 수집기를 사용하여 메모리 관리를 처리할 수 있습니다.For the majority of the objects that your app creates, you can rely on .NET's garbage collector to handle memory management. 그러나 관리되지 않는 리소스를 포함하는 개체를 만든 경우에는 응용 프로그램에서 해당 개체의 사용을 마치면 이러한 리소스를 명시적으로 해제해야 합니다.However, when you create objects that include unmanaged resources, you must explicitly release those resources when you finish using them in your app. 가장 일반적인 형태의 관리되지 않는 리소스로는 파일, 창, 네트워크 연결 또는 데이터베이스 연결 등의 운영 체제 리소스를 래핑하는 개체를 들 수 있습니다.The most common types of unmanaged resource are objects that wrap operating system resources, such as files, windows, network connections, or database connections. 가비지 수집기에서는 관리되지 않는 리소스를 캡슐화하는 개체의 수명을 추적할 수 있지만, 관리되지 않는 리소스를 해제하고 정리하는 방법에 대해서는 알 수 없습니다.Although the garbage collector is able to track the lifetime of an object that encapsulates an unmanaged resource, it doesn't know how to release and clean up the unmanaged resource.

형식이 관리되지 않는 리소스를 사용하는 경우 다음을 수행해야 합니다.If your types use unmanaged resources, you should do the following:

  • 삭제 패턴을 구현합니다.Implement the dispose pattern. 이를 수행하려면 관리되지 않는 리소스의 명확한 해제를 활성화하기 위해 IDisposable.Dispose 구현을 제공해야 합니다.This requires that you provide an IDisposable.Dispose implementation to enable the deterministic release of unmanaged resources. 개체 및 해당 개체에서 사용하는 리소스가 더 이상 필요하지 않은 경우 형식의 소비자가 Dispose를 호출합니다.A consumer of your type calls Dispose when the object (and the resources it uses) is no longer needed. Dispose 메서드가 관리되지 않는 리소스를 즉시 해제합니다.The Dispose method immediately releases the unmanaged resources.

  • 형식의 소비자가 실수로 Dispose를 호출하지 않은 경우 해제되는 관리되지 않는 리소스를 제공합니다.Provide for your unmanaged resources to be released in the event that a consumer of your type forgets to call Dispose. 여기에는 두 가지 방법이 있습니다.There are two ways to do this:

    • SafeHandle을 사용하여 관리되지 않는 리소스를 래핑합니다.Use a safe handle to wrap your unmanaged resource. 이것이 권장되는 방법입니다.This is the recommended technique. SafeHandle은 System.Runtime.InteropServices.SafeHandle 클래스에서 파생되며, 강력한 Finalize 메서드를 포함합니다.Safe handles are derived from the System.Runtime.InteropServices.SafeHandle class and include a robust Finalize method. SafeHandle을 사용하면 IDisposable 인터페이스를 간단하게 구현하고 Dispose 구현에서 SafeHandle의 IDisposable.Dispose 메서드를 호출할 수 있습니다.When you use a safe handle, you simply implement the IDisposable interface and call your safe handle's Dispose method in your IDisposable.Dispose implementation. Dispose 메서드가 호출되지 않는 경우 가비지 수집기에 의해 SafeHandle의 종료자가 자동으로 호출됩니다.The safe handle's finalizer is called automatically by the garbage collector if its Dispose method is not called.

      또는—or—

    • Object.Finalize 메서드를 재정의합니다.Override the Object.Finalize method. 종료를 사용하면 형식의 소비자가 명확하게 삭제할 수 있도록 IDisposable.Dispose를 호출하지 못한 경우 관리되지 않는 리소스가 명확하지 않게 해제됩니다.Finalization enables the non-deterministic release of unmanaged resources when the consumer of a type fails to call IDisposable.Dispose to dispose of them deterministically. 그러나 개체 종료가 복잡하고 오류가 발생하기 쉬운 작업일 수 있기 때문에 고유한 종료자를 제공하는 대신 SafeHandle을 사용하는 것이 좋습니다.However, because object finalization can be a complex and error-prone operation, we recommend that you use a safe handle instead of providing your own finalizer.

그러면 형식의 소비자가 IDisposable.Dispose 구현을 직접 호출하여 관리되지 않는 리소스가 사용하는 메모리를 확보할 수 있습니다.Consumers of your type can then call your IDisposable.Dispose implementation directly to free memory used by unmanaged resources. Dispose 메서드를 제대로 구현하면 SafeHandle의 Finalize 메서드 또는 Object.Finalize 메서드의 고유한 재정의가 Dispose 메서드가 호출되지 않는 경우 리소스를 정리하는 보호 기능이 됩니다.When you properly implement a Dispose method, either your safe handle's Finalize method or your own override of the Object.Finalize method becomes a safeguard to clean up resources in the event that the Dispose method is not called.

섹션 내용In This Section

Dispose 메서드 구현Implementing a Dispose Method
관리되지 않는 리소스를 해제하기 위해 삭제 패턴을 구현하는 방법을 설명합니다.Describes how to implement the dispose pattern for releasing unmanaged resources.

IDisposable을 구현하는 개체 사용Using Objects That Implement IDisposable
형식의 소비자가 Dispose 구현이 호출되었는지 확인하는 방법을 설명합니다.Describes how consumers of a type ensure that its Dispose implementation is called. 이를 수행하는 경우 C# using 문 또는 Visual Basic Using 문을 사용하는 것이 좋습니다.We recommend using the C# using statement or the Visual Basic Using statement to do this.

참조Reference

System.IDisposable
관리되지 않은 리소스 해제를 위한 Dispose 메서드를 정의합니다.Defines the Dispose method for releasing unmanaged resources.

Object.Finalize
관리되지 않는 리소스가 Dispose 메서드에 의해 해제되지 않은 경우 개체 종료 기능을 제공합니다.Provides for object finalization if unmanaged resources are not released by the Dispose method.

GC.SuppressFinalize
종료를 표시하지 않습니다.Suppresses finalization. 이 메서드는 종료자가 실행되지 않도록 방지하기 위해 통상 Dispose 메서드에서 호출됩니다.This method is customarily called from a Dispose method to prevent a finalizer from executing.