私のwinformsアプリケーションの中には、GDI +オブジェクト(ブラシ、ペン、フォントなど)をたくさん作成し、それらを何度も何度も使用する必要があります。私は私が必要なものを達成するためにゲットー・キャッシング・シングルトンを作成しますが、コードのにおいが圧倒的です...私はこれらのGDI +のオブジェクトを再利用するためにすべての上にそれらをインスタンス化とは対照的に、winformsアプリケーションでのGDI +オブジェクトのキャッシュ:その価値はありますか?
public sealed class GraphicsPalette
{
public static readonly GraphicsPalette Instance = new GraphicsPalette();
static GraphicsPalette()
{
}
private Dictionary<Color, Brush> solidBrushes;
//multithreading
private object brushLock;
private GraphicsPalette()
{
solidBrushes = new Dictionary<Color, Brush>();
brushLock = new object();
}
public Brush GetSolidBrush(Color color, int alpha)
{
return GetSolidBrush(Color.FromArgb(alpha, color));
}
public Brush GetSolidBrush(Color color)
{
if (!solidBrushes.ContainsKey(color))
{
lock (brushLock)
{
if (!solidBrushes.ContainsKey(color))
{
Brush brush = new SolidBrush(color);
solidBrushes.Add(color, brush);
return brush;
}
}
}
return solidBrushes[color];
}
}
- は良い方法は、あります再び
OnPaint()
などが呼び出されるたびに? - プログラムが終了したら、GDI +オブジェクトは、アンマネージメモリリークが発生します、または各
Brush
オブジェクトのファイナライザは、ターンリリース内のどの意志任意のアンマネージリソースと呼ばれますか?
これが繰り返しである場合はお詫び申し上げますが、似たような質問はありません。
シングルトンを調整することで、パフォーマンスの向上を簡単にテストできます。シングルトンとAの間で切り替えるためのフラグを追加します... "マルチトン"(私はその言葉を作った)。マルチトンは常にリソースを削除して再作成します。その後、ここに報告してください。 –
[ユーザーコントロールでBrushを処理するにはどのような方法が良いですか](http://stackoverflow.com/questions/8253398/what-is-better-approach-to-dispose-brush-in-user-control) –
あんまり。私が見つけようとしているのは、GDI +オブジェクト(ブラシ)の束にぶら下がって明示的にDispose()を呼び出さないと、それらがすべて正しくファイナライズされ、自動的に破棄されるという保証があります。私のアプリケーションドメインは終了しますか?そうでない場合、私はアンマネージメモリリークを探しています。 –