Per alcune delle mie applicazioni winforms ho bisogno di creare un sacco di oggetti GDI + (pennelli, penne, caratteri, ecc.) E utilizzarli più e più volte. Ho creato un Singleton ghetto di caching per realizzare quello che mi serve, ma il codice odore è schiacciante ...Memorizzazione nella cache di oggetti GDI + in un'applicazione winform: ne vale la pena e come farlo correttamente?
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];
}
}
- Esiste un modo migliore per me di riutilizzare questi oggetti GDI +, al contrario di istanziare loro tutto di nuovo ogni volta che
OnPaint()
viene chiamato? - Gli oggetti GDI + causano una perdita di memoria non gestita una volta terminato il programma o verrà chiamato il finalizzatore per ogni oggetto
Brush
che a sua volta rilascerà eventuali risorse non gestite?
Mi scuso se si tratta di una ripetizione, ma non ho trovato domande simili.
È possibile testare facilmente qualsiasi miglioramento delle prestazioni modificando il singleton. Aggiungi una bandiera per alternarla tra un singleton e un ... "multi-ton" (ho fatto quella parola in alto). Il multi-ton eliminerà SEMPRE e ricreerà la risorsa. Quindi riporti qui. –
possibile duplicato di [Qual è l'approccio migliore per eliminare Brush in User Control] (http://stackoverflow.com/questions/8253398/what-is-better-approach-to-dispose-brush-in-user-control) –
Non proprio. Quello che sto cercando di scoprire è che, se mi aggrappo a un gruppo di oggetti GDI + (pennelli) e non chiamiamo esplicitamente Dispose() su di essi, ho la garanzia che verranno tutti correttamente finalizzati e disposti automaticamente quando il mio dominio dell'applicazione termina? Se questo non è il caso, allora sto guardando una perdita di memoria non gestita. –