c# - Why this application is taking so much of memory? -


so problem is, created 1 app personal use fetch html pages sites , display in web browser after alteration. every thing working fine perturbed me memory taking. after querying 3-4 terms, memory usage reaches approximate 300-400 mb.

some relevant code app is

void sentencebox_navigated(object sender, webbrowsernavigatedeventargs e)         {             gc.collect();         }     htmldocument hd;     word w=new word();      private void button1_click(object sender, eventargs e)     {         button1.enabled = false;         status.text = "processing english req..";         if (checkinhis(querytxt.text))         {             sentencebox.allownavigation = true;             richtextbox1.text = w.engdefinition;             sentencebox.documenttext = w.engdefinition;             status.text = "word found in history.done!";             button1.enabled = true;             return;         }         if (w == null || w.engwordprop != querytxt.text)         {             w.engwordprop=querytxt.text;             w.loadengdefn();             w.engdefnloadedevent += new word.engdefnloaded(w_engdefnloadedevent);             return;         }         w.loadengdefn();         w.engdefnloadedevent += new word.engdefnloaded(w_engdefnloadedevent);     }      void w_engdefnloadedevent(word sender, eventargs data)     {         sentencebox.allownavigation = true;         sentencebox.documenttext = sender.engdefinition;         sender.engdefnloadedevent -= w_engdefnloadedevent;         button1.enabled = true;     }      private void addtohistory(word w)     {         status.text = "saving offline...";         if (!checkinhis(w.engwordprop))         {         history.add(w); //        label1.text = w.engwordprop + " saved in localdb. database size: " + history.count;          w = null;         }         else         { //                label1.text = w.engwordprop + " skipped. database size: " + history.count;          }     }      private boolean checkinhis(string p)     {         status.text = "checking offline storage...";         foreach (word item in history)         {             if (item.engwordprop == p)             {                 status.text = "word found in history.";                 w = item;                 return true;             }         }         status.text = "not found in offline database...";         return false;     }      private void sentencebox_documentcompleted(object sender, webbrowserdocumentcompletedeventargs e)     {         ((webbrowser)sender).allownavigation = false;     }      private void button2_click_1(object sender, eventargs e)     {         button2.enabled = false;         status.text = "requesting hindi definition...";         if (checkinhis(querytxt.text))         {             sentencebox.allownavigation = true;             sentencebox.documenttext = w.hindidef;             status.text = "done!";             button2.enabled = true;             return;         }         if (w == null || w.engwordprop != querytxt.text)         {             w.engwordprop=querytxt.text;             w.loadhindefn();             w.hindidefloadedevent += new word.hindidefloaded(w_hindidefloadedevent);             return;         }         w.loadhindefn();         w.hindidefloadedevent += new word.hindidefloaded(w_hindidefloadedevent);     }      void w_hindidefloadedevent(word sender, eventargs data)     {         sentencebox.allownavigation = true;         sentencebox.documenttext = sender.hindidef;         button2.enabled = true;         sender.hindidefloadedevent -= w_hindidefloadedevent;     }   private void button3_click(object sender, eventargs e)     {         button3.enabled = false;         saveword(w);         button3.enabled = true;     }      private void saveword(word w)     {         if (w.hindidef == "")         {             w.loadhindefn();             w.hindidefloadedevent += new word.hindidefloaded(w_hindidefloadedeventforhindisave);         }         if (w.engdefinition == "")         {             w.loadengdefn();             w.engdefnloadedevent += new word.engdefnloaded(w_engdefnloadedeventforenglishsave);         }         addtohistory(w);     }      void w_hindidefloadedeventforhindisave(word sender, eventargs data)     {         sender.hindidefloadedevent -= w_hindidefloadedevent1;         sender.hindidefloadedevent -= w_hindidefloadedeventforhindisave;     }     void w_engdefnloadedeventforenglishsave(word sender, eventargs data)     {         sender.engdefnloadedevent -= w_engdefnloadedeventforenglishsave;         sender.engdefnloadedevent -= w_engdefnloadedeventforenglishsave;     }      void w_hindidefloadedevent1(word sender, eventargs data)     {         saveword(sender);         sender.hindidefloadedevent -= w_hindidefloadedevent1;     }      void w_engdefnloadedevent1(word sender, eventargs data)     {         sender.loadhindefn();         sender.hindidefloadedevent += new word.hindidefloaded(w_hindidefloadedevent1);         sender.engdefnloadedevent -= w_engdefnloadedevent1;     }      void initword(string query)      {         querytxt.text = query;         w.engwordprop=querytxt.text;         w.loadengdefn();         w.loadhindefn();         w.engdefnloadedevent += new word.engdefnloaded(w_engdefnloadedevent);         w.hindidefloadedevent += new word.hindidefloaded(w_hindidefloadedevent);     } 

word class

    public word(string q)     {         wb1 = new webbrowser();         wb2=new webbrowser();         engword = q;         hindidef = "";         engdefinition = "";         flage = false;         flagh = false;         engurl = "http://oxforddictionaries.com/definition/english/" + q + "?q=" + q;         hindiurl = "http://dict.hinkhoj.com/hindi-dictionary.php?word=" + q;         wb1.documentcompleted += new webbrowserdocumentcompletedeventhandler(wb_documentcompleted); ;                         wb2.documentcompleted+=new webbrowserdocumentcompletedeventhandler(wb_documentcompleted);     }      public delegate void engdefnloaded(word sender, eventargs data);     public event engdefnloaded engdefnloadedevent;     protected void onengdefnloadcompleated(word sender, eventargs data)     {         if (engdefnloadedevent!=null)         {             engdefnloadedevent(this,data);         }     }       public void loadengdefn()     {         if (this.engdefinition=="")         {   //          wb1 = new webbrowser();             wb1.scripterrorssuppressed = true;             wb1.url = new uri(this.engurl);         }         else         {             if (engdefnloadedevent!=null)             {                 engdefnloadedevent(this, new eventargs());             }         }      }       public void loadhindefn() {         if (this.hindidef=="")         {     //        wb2 = new webbrowser();             wb2.scripterrorssuppressed = true;             wb2.url = new uri(this.hindiurl);         }         else         {             if (hindidefloadedevent!=null)             {                 hindidefloadedevent(this, new eventargs());             }         }      }    [nonserialized]      htmldocument hd;      void wb_documentcompleted(object sender, webbrowserdocumentcompletedeventargs e)     {              if (((webbrowser)sender).readystate == webbrowserreadystate.complete)             {                 hd = ((webbrowser)sender).document;                 if (e.url.tostring() == this.hindiurl)                 {                     parsepage(hd.getelementbyid("maint"), "hindi");                     ((webbrowser)sender).documentcompleted -= wb_documentcompleted;                     sender = null;                 }                 else                 {                     parsepage(hd.getelementbyid("entrypagecontent"), "eng");                     ((webbrowser)sender).documentcompleted -= wb_documentcompleted;                     sender = null;                 }              }                     }      private void parsepage(htmlelement hd, string lan)     {         htmlelementcollection he;         if (lan == "eng")         {             = hd.getelementsbytagname("section");             foreach (htmlelement item in he)             {                 this.engdefinition += item.innerhtml + "<br>";             }             flage = true;             engdefnloadedevent(this, new eventargs());             wb1 = null;             wb1.dispose();             return;         }         else         {             = hd.getelementsbytagname("div");             foreach (htmlelement item in he)             {                 if (item.getattribute("itemprop") == "itemlistelement")                 {                     this.hindidef += item.getelementsbytagname("div")[0].innerhtml + "<br>";                 }             }             flagh = true;             hindidefloadedevent(this,new eventargs());             wb2 = null;             wb2.dispose();             return;         }     } 

question: how remove memory leak issue ?

sample pic memory snap after 2 4-5 queries.

after query 25 words.

deadlock

first i'd point out because application uses 300 - 400 mb of memory doesn't mean have memory leak. if memory keeps increasing each requested page , never released have leak.

second, in order diagnose problem need run memory profiler. if using premium or ultimate edition of visual studio, has memory profile feature. if not can use either redgate memory profile (14-day free trial) or similar software.

i add common cause leaks in .net use of events short lived object attaches observer/handler event raised long lived object.


Comments

Popular posts from this blog

c# - How Configure Devart dotConnect for SQLite Code First? -

c++ - Clear the memory after returning a vector in a function -

erlang - Saving a digraph to mnesia is hindered because of its side-effects -