- 使用缓存机制管理,参考winform中DataGridView中管理非托管资源的方式。
- 下面以画刷和字体两种非托管资源的维护为例
public class MyUserControl : UserControl
{
// 定义非托管资源缓存集合
private Hashtable m_brushesCache;
private Hashtable m_fontCache;
public MyUserControl()
{
// 初始化缓存集合
m_brushesCache = new Hashtable(1);
m_fontCache = new Hashtable(1);
}
protected override void OnPaint(PaintEventArgs e)
{
// 使用画刷缓存
SolidBrush solidBrush = GetCachedBrush(BackColor);
// 使用字体缓存
Font font = GetCacheFont("Microsoft YaHei", 13, FontStyle.Regular, GraphicsUnit.Pixel);
}
/// <summary>
/// 重写Dispose,释放缓存
/// </summary>
/// <param name="disposing"></param>
protected override void Dispose(bool disposing)
{
if (m_brushesCache != null)
{
if (m_brushesCache.Count > 0)
{
foreach (SolidBrush value in m_brushesCache.Values)
{
value.Dispose();
}
m_brushesCache.Clear();
}
m_brushesCache = null;
}
if (m_fontCache != null)
{
if (m_fontCache.Count > 0)
{
foreach (Font value in m_fontCache.Values)
{
value.Dispose();
}
m_fontCache.Clear();
}
m_fontCache = null;
}
base.Dispose(disposing);
}
/// <summary>
/// 获取画刷缓存的方法
/// </summary>
/// <param name="color"></param>
/// <returns></returns>
private SolidBrush GetCachedBrush(Color color)
{
SolidBrush solidBrush = (SolidBrush)m_brushesCache[color];
if (solidBrush == null)
{
solidBrush = new SolidBrush(color);
m_brushesCache.Add(color, solidBrush);
}
return solidBrush;
}
/// <summary>
/// 获取字体缓存的方法
/// </summary>
/// <param name="familyName"></param>
/// <param name="emSize"></param>
/// <param name="style"></param>
/// <param name="unit"></param>
/// <returns></returns>
private Font GetCacheFont(string familyName, float emSize, FontStyle style, GraphicsUnit unit)
{
FontKey fontKey = new FontKey(familyName, emSize, style, unit);
Font font = (Font)m_fontCache[fontKey];
if (font == null)
{
font = new Font(familyName, emSize, style, unit);
m_fontCache.Add(fontKey, font);
}
return font;
}
}