2010-05-24 4 views
0

내 응용 프로그램의 핸들 수가 지속적으로 증가하는 문제가 있습니다. 나는 디버깅을했고 이것이 System.Threading.Thread 클래스에 의해 발생한다는 것을 알아 냈다. 내가 버튼을 클릭하고있어.NET System.Threading.Thread 클래스로 핸들 누수가 발생했습니다.

... 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Thread t = new Thread(DoWork); 
     t.Start(); 
    } 

    public void DoWork(object parameter) 
    { 
     // Do something... 
    } 

    ... 

때마다 스레드가 System.Threading.Thread 클래스를 사용하여 만들어집니다 : 나는 샘플 .NET 응용 프로그램을 만든 디버깅을 간소화합니다. 문제는 핸들 클릭 수가 각각 5 % 증가하기 때문에 스레드가 핸들을 해제하지 않는 것처럼 보입니다.

질문 : System.Threading.Thread 클래스로 만든 모든 핸들을 수동으로 해제하려면 어떻게해야합니까?

미리 감사드립니다.

+1

이 응용 프로그램이 누출되어 핸들의 종류에 따라 달라집니다 버그 방법은 할당됩니다. 'DoWork' 메소드는 무엇을합니까? –

+0

실제로 DoWork가 아무런 작업을하지 않더라도 (예에서와 같이) 5 개의 핸들이 누수됩니다. 내가 한 : 1) 테스트. NET 응용 프로그램을 만들 2) 메인 양식에 버튼을 배치 3) 내 예제에서 버튼 클릭 이벤트 처리기와 DoWork를 추가합니다. 그게 전부 야. 너무 단순한 응용 프로그램에서도 원인 5 핸들 누출 – Mahno

답변

1

실제로 핸들이 누출되는 것은 아니며 GC가 아직 수집하지 않은 것입니다. 단추 처리기에서 코드를 변경하여 루프를 만들고 500 개의 스레드 또는 무언가를 만들고 몇 번 눌러보십시오. 그러면 핸들이 수집되는 것을 볼 수 있습니다.

+0

나는 이미 GC를 의심하고 하루 (내 응용 프로그램과 함께) 기다려려고 - 아무 일도 없었어. 이제 테스트 앱으로 테스트를 반복하겠습니다. 지금까지 나는 약 1K 개의 핸들을 얻기 위해 여러 번 클릭했다. 여전히 10 분이 지난 후에도 같은 수의 핸들이 기다리고 있습니다 ... – Mahno

+0

1000은 여전히 ​​물건을 만들기 시작하기에는 너무 적을 수도 있고, 5-10,000을 시도하면 즉시 일어나는 일을 볼 수 있습니다. –

+0

Hmmm ... GC 정리 작업을 수동으로 시행 할 수있는 방법이 있습니까? "GC에 의해 정리되기 전에 또 다른 10K 핸들을 기다리십시오"와 같은 실제 응답은 내 고객을 만족시키지 못할 것입니다 ... – Mahno

1

스레드 핸들을 수동으로 해제 할 필요가 없습니다. Thread 인스턴스에 대한 모든 참조를 삭제하면됩니다. 스레드가 더 이상 실행 중이 지 않고 스레드에 대한 모든 참조가 제거되면 gargabe 수집기는 다음 수집에서 핸들을 해제합니다.

경우에 따라 스레드가 끝나는 것처럼 보이지 않습니다.

+0

내 스레드는 마우스 클릭 해 들러 함수에서 로컬로 생성됩니다 (예제 참조). 즉, 함수를 떠나는 순간 모든 참조가 삭제됩니다. 그러나 사실 이것은 그렇지 않습니다. 핸들이 남아 있습니다. – Mahno

관련 문제