2011-09-08 2 views
0

.NET 런타임과 관련된 것으로 보이는 그래픽 문제가 있습니다. 가끔씩, 모든 GroupBox의 테두리와 응용 프로그램의 모든 NumericUpDowns의 화살표가 사라집니다. NumericUpDowns에는 때때로 화살표가 있어야하는 그래픽 쓰레기가 있기 때문에 어떤 이유로 다시 그리기를 중지 한 것 같습니다.GroupBoxes 및 NumericUpDowns의 .NET 그래픽 문제

우리는 응용 프로그램을 여러 번 다시 시작한 후에 오류가 발생했다고 생각합니다. 문제가 발생하면 응용 프로그램을 다시 시작해도 도움이되지 않습니다. 그러나 모든 .NET 프로세스를 닫고 응용 프로그램을 다시 시작하면 문제가 사라지며 .NET 런타임의 문제를 지적합니다.

우리의 응용 프로그램은 VS 2008 SP1 및 대상 .NET 3.5를 사용하여 개발 된 WinForms 응용 프로그램입니다. 클래식 모드 (클라이언트 회사 정책)로 Windows XP SP3에서 실행됩니다.

비슷한 문제가있는 다른 항목을 검색했지만 대부분의 조회수에는 GroupBox에 대한 맞춤 페인트 이벤트가 포함됩니다. 우리의 컨트롤은 일반 표준이며 아무 페인트 이벤트도 전혀 사용되지 않습니다.

편집 : 어떻게 고의적으로 문제를 재현하기 위해 데스크톱 힙 소모 할 수 있습니다? 나는 작업 관리자와 GdiUsage로 놀고 있었고, 펜, 브러시, 글꼴은 미친 듯이 만들었습니다. 물론 처분을 호출하지 않고 가비지 수집을 피하기 위해 목록에 저장합니다. 하지만 임의의 색상으로 100,000 개의 펜을 만든 후에는 모니터 도구에 따라 몇 가지 개체 만 있습니다.

List<Pen> pens = new List<Pen>(); 
Random rnd = new Random(); 
for(int i = 0; i < 100000; i++) 
    pens.Add(new Pen(Color.FromArgb(rnd.Next()))); 
+0

펜 목록이 범위를 벗어나면 모든 펜을 가비지 수집 할 수 있습니다. 리스트를 로컬 변수의 insted 클래스에 저장하십시오. –

+0

예제가 약간 명확하지 않지만 목록은 실제로 클래스에 저장됩니다. – Anlo

답변

2

이것은 핸들을 누출시키는 프로그램의 표지입니다. Windows는 컴퓨터에서 실행되는 모든 프로그램에 대한 GDI 및 사용자 개체에 대한 힙을 유지 관리합니다. 각 개별 프로세스마다 10,000 개의 핸들을 할당 할 수 있지만 누수되거나 무거운 두 개의 프로그램이 용량을 충당 할 수 있습니다. 그런 일이 발생하면 펜을 사용하여 테두리를 그리는 요청이 실패하고 물건이 그려지기 시작합니다. 항상 네이티브 코드에서 항상 확인되는 것은 아닙니다.

Taskmgr.exe, 프로세스 탭을 사용하여 진단 할 수 있습니다. View + Select Columns를 사용하고 Handles, USER Objects 및 GDI Objects를 선택하십시오. 이 프로그램이 많은 (수백) 프로그램을 사용하는 동안 꾸준히 숫자가 증가하는 것을 지켜보십시오.

Dispose() 또는 을 사용하지 않으면 .NET 프로그램에서 핸들을 누출시킬 수 있습니다. 펜, 브러시, 글꼴, 비트 맵과 같은 일회용 개체에 문을 사용하십시오. 그리고 프로그램이 그렇지 않으면 가비지 콜렉션을 트리거하기에 충분한 메모리를 사용하지 않아 파이널 라이저가 핸들을 해제 할 수 없습니다.

+0

지식이 풍부하고 상세한 답변을 해주셔서 감사합니다. 동일한 컴퓨터에서 실행중인 다른 .NET 응용 프로그램에서 많은 GDI + 드로잉을 사용합니다. 우리는 대부분의 그래픽 객체를 처리하지만 일부는 놓친 것일 수 있습니다. 내일 조사 할 것입니다 ... – Anlo