큰 응용 프로그램에서 GDI 리소스 누수를 조사하고 있습니다. 이러한 문제가 어떻게 발생했는지에 대한 이해를 돕기 위해 의도적으로 '새는'응용 프로그램을 만들었습니다. 여기에 100 펜 객체의 생성을 초래할해야 간단한 사용자 컨트롤입니다 : 내 객체의 인스턴스를 생성하고 폼에 추가 그러나Windows Forms에서 GDI 누수를 어떻게 만들 수 있습니까?
public partial class TestControl : UserControl { private List pens = new List(); public TestControl() { InitializeComponent(); for (int i = 0; i < 100; i++) { pens.Add(new Pen(new SolidBrush(Color.FromArgb(255, i * 2, i * 2, 255 - i * 2)))); } this.Paint += new PaintEventHandler(TestControl_Paint); } void TestControl_Paint(object sender, PaintEventArgs e) { for (int i = 0; i < 100; i++) { e.Graphics.DrawLine(pens[i], 0, i, Width, i); } } }
가, 나는 현재 참조 윈도우 작업 관리자 내 응용 프로그램을보고 ~ 37 개의 GDI 개체. 반복적으로 새 TestObject 사용자 정의 컨트롤을 폼에 추가하면 여전히 ~ 37 개의 GDI 개체 만 볼 수 있습니다.
여기에 무슨 일이 일어나고 있습니까? 나는 System.Drawing.Pen의 생성자가 새로운 GDI 객체를 사용하여 새로운 Pen을 생성하기 위해 GDI + API를 사용할 것이라고 생각했다.
여기에 너트가 있어야합니다. GDI 개체를 만드는 간단한 테스트 응용 프로그램을 작성할 수 없다면 어떻게 누출시킬 수 있습니까?
도움을 주시면 감사하겠습니다.
안부, 콜린 E.
이상한 문제가 있습니다. 동의합니다. 여부를 확인 했습니까? GDI 개체 수를 37 회 이상 줄이면 * 37에서 감소합니까? – Noldorin
예 - 37 개의 GDI 개체가 간단한 테스트 응용 프로그램 자체의 오버 헤드와 관련이있는 것 같습니다. 위의 코드에서 루프의 수와 아무 관련이 없습니다. 나는 OregonGhost (아래)가 GDI +가 GDI 핸들을 사용하고 있지 않다는 것을 알고 있다고 생각한다. 거기에 몇 가지 문서가 있었으면 좋겠어. –