c# - Memory leak in WPF code -


i have code, runs every time "primary menu" item clicked. fills out submenu stackpanel "buttoned" user controls.

    private void loadsubmenucontrols(int _menuid)     {         double _itemcount = 0;         double _buttonheight = 61;         //fill out user permissions         //get information  users         //release events , 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 more items height allows display          //scrolbar , hide border         //also squeeze midframe accomodate scrollbar 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 rpevent memory link occuring in function          //system.threading.thread.sleep(200);         //gc.collect();         //gc.waitforpendingfinalizers();      } 

what i've noticed happening every time code executed memory on process goes several k , never lets down. i've discovered reading forcing garbage collection can help, , does, i've read it's not practice , want find leak occurs.

to state question, how can capture leak, , code cause of it?

thank you.

getmenuitems comes 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 ommited         /// or submenu items when int parentid specified         /// </summary>         /// <returns></returns>         public datarow[] getmenuitems()         {              return _table.select("parentid=0");          }         /// <summary>         /// fetches main menu items when parentid ommited         /// or submenu items when int parentid 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         {                         {                 return _table;             }         } 

in code:

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());         } 

the sqlconnection not closed. if sqlconnection goes out of scope, won't closed. therefore, must explicitly close connection calling close or dispose. close , dispose functionally equivalent.

if connection pooling value pooling set true or yes, underlying connection returned connection pool. on other hand, if pooling set false or no, underlying connection server closed.

this reason why memory goes up.

to use sqlconnection properly, can follow this:

using (sqlconnection connection = new sqlconnection(connectionstring))     {          // work here; connection closed on following line.     } 

please read msdn details

please check if ui objects you're using should disposed explicitly ui object allocate native handles.


Comments

Popular posts from this blog

java - Intellij Synchronizing output directories .. -

git - Initial Commit: "fatal: could not create leading directories of ..." -