2009-04-16 3 views
2

나는 약간의 느린 GDI 핸들의 소스를 추적하기 위해 GDIView을 사용하고 있으며 소스는 양식의 메뉴에 사용 된 글꼴 인 것 같습니다. 내가하기 위해 찾은 유일한 방법은 확실 글꼴 핸들 GCed 명시 적으로 다음과 같이 null로 설정하는 것입니다 :글꼴 핸들이 삭제되지 않는 이유는 무엇입니까?

tsmiTextLocation.Font = null; 
tsmiLocationSelection.Font = null; 

이 보이지 않는다 아주 잘 나,하지만 난 모르겠어요 어떻게 다른 문제를 해결할 수 있습니다. 다른 누구도 전에이 문제에 부딪 혔습니까?

답변

6

IDisposable.Dispose()을 직접 호출하거나 using 키워드를 사용하여 직접 호출하는 것이 가장 좋습니다. 일부 GDI + 개체는이 규칙에서 예외입니다.

GDI +에는 미리 정의 된 브러시와 펜이 Brushes and Pens 클래스에 들어 있습니다. 이 클래스의 멤버 (또는 사용자가 직접 new로 작성하지 않은 다른 GDI 사전 캐시 된 객체)가 반환 한 객체에 Dispose()을 호출하면 안됩니다.

그리고 MSDN에서 메모

- Font.Dispose : 당신이 글꼴에 대한 마지막 참조를 해제하기 전에는

는 반드시 Dispose를 호출합니다. 그렇지 않으면 가비지 콜렉터가 Font 객체의 Finalize 메서드를 호출 할 때까지 사용중인 리소스가 해제되지 않습니다.

+0

양식 내에서 마지막 참조가 무엇인지 알 수있는 방법이 있습니까? 아니면 내 양식의 처분 방법에 모든 글꼴을 재귀 적으로 처리해야합니까? –

1

null로 설정하면 결국 가비지 수집되어 최종자가 호출됩니다. 이것은 약간의 시간이 걸릴 수 있습니다. 객체가 잠시 동안 살 수없는 메모리 압력이 있다면.

System.Drawing.Font는 IDisposable을 구현하므로 Font.Dispose를 호출하여 관리되지 않는 리소스 (GDI 핸들)를 결정적으로 해제해야합니다.

글꼴을 공유 할 수 있으므로 Dispose 메서드를 사용하여 글꼴을 처리 할 수 ​​없으므로 Dispose를 명시 적으로 호출해야한다고 생각합니다.

+0

그러나 처분하는 글꼴은 양식의 처분 방법에 의해 호출되어야합니다. 양식의 다른 컨트롤 중 하나에서 글꼴 오브젝트와 관련된 대부분을 볼 수 없습니다. –

+0

아, 나는 당신이 양식을 폐기하고 있다는 것을 몰랐습니다. 양식을 처리하려면 모든 관리되지 않는 리소스를 해제해야합니다. Debugger의 Font.Dispose에 중단 점을 넣고 폼이 발생할 때 Dispose가 호출되는지 확인할 수 있습니다. – Michael

+0

조금 빠른 조사를 해답을 업데이트했습니다. – Michael

0

클래스가 IDisposable을 구현하는 경우 모든 인스턴스에서 Dispose를 호출해야합니다.

대부분의 GDI 클래스는 IDisposable을 지원합니다.

관련 문제