2012-09-10 5 views
1

C#에서 [STAThread]으로 실행되는 프로그램이 있습니다.C에서 자원 확보 #

프로그램은 주기적으로 클래스 X의 인스턴스를 만들고이를 목록에 추가합니다.
시간이 지나면 이러한 X 인스턴스가 수행해야하는 작업이 완료되고 클래스 인스턴스가 더 이상 필요하지 않습니다.
단일 스레드에서 실행 중이므로 더 이상 필요하지 않더라도 이러한 X 인스턴스가 동시에 실행되어 자원이 소모 될 수 있으므로 X 인스턴스가 있음을 알 때 리소스를 확보하고 싶습니다. 끝내서 내 프로그램이 느려지지 않도록. 메모리에서 클래스 X의 첫 번째 인스턴스의 모든 흔적을 제거합니다 작업 myList.RemoveAt(0) 수행

  1. : 만약 내가 궁금

    public partial class Form1 : Form 
    { 
        List<X> myList = new List<X>(); 
    
        ... 
    } 
    

    : 같은

    내 코드 보인다.

  2. 이렇게하는 것이 더 좋은 방법이라면.

고마워요! Chris

+1

에 코드를 변경하면 X에서 사용하는 객체의 폐기 메도를 호출하는 폐기 방법을 쓰기 가비지 컬렉터. – Reniuz

답변

2

목록에서 클래스를 제거해도 메모리 번호에서 해당 코드의 모든 흔적이 제거되지는 않습니다. C#은 가비지 수집기가있는 관리되는 언어입니다. 특정 객체가 "활성"으로 간주되는 모든 위치에서 더 이상 참조되지 않을 때마다 (참조가 여전히 코드에서 액세스 될 수 있음을 의미) 가비지 수집에 * 적합합니다 *. 즉, GC는 미래에 어떤 불확실한 시간에 해당 객체의 메모리를 자유롭게 정리할 수 있다는 것을 의미합니다. 그것은 바로있을 수도 있고 오랜 시간 일 수도 있습니다. 다행히도 거의 걱정할 필요가 없습니다. 더 이상 필요하지 않은 대량의 메모리를 사용하는 객체에 대한 참조를 보유하지 않도록해야합니다.

귀하의 경우에는 세부 정보를 많이 제공하지 않았습니다. 클래스 X에 관해 아무 것도 모른 채, 나는 그 많은 추억을 소비하지 않고 목록이 아마도 그다지 크지 않을 것이라고 말할 것입니다. 그것이 며칠 동안 진행될 장기간의 작업이 아니라면, 해방되지 않은 채로해야하는 것보다 조금 오래갑니다.

이러한 개체가 많은 메모리를 소비하는 경우 (대용량 데이터베이스 쿼리 결과, 대용량 파일의 내용 등이 포함 된 경우) 왜 처음에는 목록이 있는지 묻습니다. 형식의 목록을 만들고이를 백그라운드 스레드에서 사용하고 있다고 설명합니다. 전체 목록이 백그라운드 스레드로 전달 되었습니까? 그냥 특정 항목? 백그라운드 스레드에 전달되는 경우 주 스레드에서 더 이상 참조가 필요하지 않을 가능성이 있습니다 (확실하게 말할 수있는 코드를 더 많이 표시해야 함).

0

아니요, myList.RemoveAt(0);은 목록에서 개체에 대한 참조 만 제거합니다. 그러나 가비지 수집기 (GC)는 더 이상 참조가 없으므로 전체 개체를 제거합니다.

관리되지 않는 메모리를 사용하지 않고 GC를 신뢰하면 그가 정확히 객체를 제거 할 때를 알 수 없지만 괜찮습니다. 그냥 그대로 두십시오.

클래스 X (COM 개체, 파일 핸들 등)에서 기본적으로 Dispose() 메서드가있는 관리되지 않는 메모리를 사용하는 경우 개체에 대한 참조를 제거하기에 충분하지 않습니다.이 경우, 클래스 X의는 IDisposable 인터페이스를 구현하고 폐기 개체에 대한 읽기 그럼 난 당신을 제안

myList[0].Dispose(); 
myList.RemoveAt(0);