大規模なアプリケーションでのGDIリソースリークを調査しています。これらの問題がどのように発生するかをさらに理解するために、意図的に「リーク」した非常に小さなアプリケーションを作成しました。これは、100個のペンオブジェクトを作成するための簡単なユーザーコントロールです。
パブリック部分クラスTestControl:UserControl {{ プライベートリストペン=newList(); 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(オブジェクト送信者、PaintEventArgs e) {{ for(int i = 0; i <100; i ++) {{ e.Graphics.DrawLine(pens [i]、0、i、Width、i); } } }
ただし、オブジェクトのインスタンスを作成してフォームに追加すると、TaskManagerを使用してアプリケーションを見ると、現在、最大37個のGDIオブジェクトが表示されます。新しいTestObjectユーザーコントロールをフォームに繰り返し追加しても、 37個までのGDIオブジェクトしか表示されません。
ここで何が起こっているのか!System.Drawing.Penのコンストラクターは、GDI + APIを使用して新しいペンを作成し、新しいGDIオブジェクトを使用すると思いました。
私はここで気が狂うに違いない。GDIオブジェクトを作成する簡単なテストアプリケーションを作成できない場合、それらをリークするテストアプリケーションを作成するにはどうすればよいですか。
どんな助けでも大歓迎です。
よろしく、コリンE。