I have this code, that runs every time a "primary menu" item is clicked. It basically fills out a submenu stackpanel with "buttoned" user controls.
private void LoadSubMenuControls(int _menuid)
{
double _itemcount = 0;
double _buttonHeight = 61;
//fill out user permissions
//get information from users
//release events and bindintgs
foreach (Object _child in Midmenu.Children)
{
((MenuButton)_child).MidMousePressed -= new MenuButton.MidMenuMouseButtonPressed(MenuButton_MidMousePressed);
((MenuButton)_child).DataContext = null;
}
Midmenu.Children.Clear();
midScroll1.ScrollToTop();
Midmenu.Height = MidHeight;
Midmenu.Width = this.Width / 3;
foreach (DataRow _row in _rxworksmenues.GetMenuItems(_menuid))
{
_itemcount++;
MainScreenWPFUC.MenuButtonViewModel _butview = new MenuButtonViewModel();
_butview.ApplyViewModel(_row,_itemcount);
_butview.MenuButton.DataContext = _butview;
_butview.MenuButton.Height = _buttonheight;
_butview.MenuButton.Width = Midmenu.Width;
_butview.MenuButton.MidMousePressed += new MenuButton.MidMenuMouseButtonPressed(MenuButton_MidMousePressed);
Midmenu.Children.Add(_butview.MenuButton);
Midmenu.UpdateLayout();
}
//When there are more items than height allows display the
//scrolbar and hide the border
//also squeeze the midframe to accomodate scrollbar with width of 56 px
if (MidHeight < _rxworksmenues.CountMenuItems(_menuid) * _buttonHeight)
{
midScroll1.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
Midmenu.ScrollOwner = midScroll1;
Midmenu.Width = this.Width /3 - 56;
ScrollViewerBorder.BorderThickness = new Thickness(1,0,0,0);
}
else
{
midScroll1.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;
ScrollViewerBorder.BorderThickness = new Thickness(1,0,1,0);
}
//TFS 10560
//Forces garbage collection to rpevent memory link occuring in this function
//System.Threading.Thread.Sleep(200);
//GC.Collect();
//GC.WaitForPendingFinalizers();
}
What I've noticed happening is that every time this code is executed the memory on the process goes up several K and never lets down. What I've discovered from reading is that forcing garbage collection can help, and it does, but I've also read it's not a good practice and want to find where the leak actually occurs.
To state a question, how can I capture the leak, and is the code the cause of it?
Thank you.
GetMenuItems comes from this class.
public class Menues
{
private DataTable _table = new DataTable("menues");
public Menues()
{
}
public void Fill(int sysuserid, string dbconnection)
{
// DateTime start = new DateTime(DateTime.Now.Ticks);
SqlConnection _conn = new SqlConnection( dbconnection);
SqlCommand _comm = new SqlCommand("Get_RxWorks_Menues",_conn);
_comm.CommandType = CommandType.StoredProcedure;
SqlParameter _param = new SqlParameter("@sysuserid",sysuserid);
_comm.Parameters.Add(_param);
SqlDataAdapter _da = new SqlDataAdapter(_comm);
_da.Fill(_table);
// DateTime end = new DateTime(DateTime.Now.Ticks);
// MessageBox.Show(end.Subtract(start).TotalMilliseconds.ToString());
}
/// <summary>
/// Fetches main menu items when parentid is ommited
/// or submenu items when int parentid is specified
/// </summary>
/// <returns></returns>
public DataRow[] GetMenuItems()
{
return _table.Select("parentid=0");
}
/// <summary>
/// Fetches main menu items when parentid is ommited
/// or submenu items when int parentid is specified
/// </summary>
/// <returns></returns>
public DataRow[] GetMenuItems(int parentid)
{
return _table.Select("parentid=" + parentid);
}
/// <summary>
/// Returns number of menu items, when empty returns left menu
/// </summary>
/// <returns></returns>
public int CountMenuItems()
{
return _table.Select("parentid=0").Length;
}
/// <summary>
/// Returns number of menu items, when empty returns left menu
/// </summary>
/// <returns></returns>
public int CountMenuItems(int parentid)
{
return _table.Select("parentid=" + parentid).Length;
}
public DataTable MenuTable
{
get
{
return _table;
}
}