Form.Dispose() problem

Latest post 12-21-2009 11:00 by Cosmic Sailor. 6 replies.
  • 12-17-2009 12:53

    Form.Dispose() problem

    Iinteresuje me sljedece.

    Želio bih da klikom sa jedne forme otvorim drugu i da nakon što zatvorim drugu formu istu i disposeujem.

     

    public class Form1 : Form

    {

         public Form1

                 {

                    InitializeComponent();

                  }

         public void button1_Click(object sender, EventArgs e)

                 {

                  Form2 form2 = new Form2()

                  form2.Show();

     

                 }

    }

     

     

    public class Form2 : Form

    {

            public Form2()

                 {

                    InitializeComponent();

                  }

           public void Form2_FormClosed(object sender, EventArgs e)

              {

                 this.Dispose();

              }

    }

     

     

    Posmatrajuci TaskManager primijetio sam da se nakon klika na dugme Mem Usage poveca ali da se nakon zatvaranja druge forme Mem Usage ostane na istom ili se cak poveca.

    Da li bi mi neko objasnio koja je najbolja strategija za prevenciju memory leakinga pri radu sa win formama?

    • Post Points: 51
  • 12-17-2009 15:16 In reply to

    • Paki
    • Top 10 Contributor
    • Joined on 01-30-2007
    • Beograd
    • Posts 162
    • Points 9,999
    • Administrators

    Re: Form.Dispose() problem

    Cosmic Sailor:

    Posmatrajuci TaskManager primijetio sam da se nakon klika na dugme Mem Usage poveca ali da se nakon zatvaranja druge forme Mem Usage ostane na istom ili se cak poveca.

    Da li bi mi neko objasnio koja je najbolja strategija za prevenciju memory leakinga pri radu sa win formama?

    Vrlo verovatno se ne radi o memory leak-u ve' o tome da Garbage Collector jo[ nije do[ao da pokupi ubijene objekte. Kada se pozove Dispose(), objekat se markira za brisanje. U zavisnosti od toga koliko je memorije zauzeto, koliko je još ostalo na raspolaganju, veličini objekata koji čekaju na brisanje i još nekih parametara, .NET GC odlučuje koje objekte će obrisati i kada.

    Na http://msdn.microsoft.com/en-us/library/ms973837.aspx možes da pogledaš kao GC radi ispod haube.

    Proveri i da li neki objekat još ima strong referencu na drugu formu

    Ivan Pavlović - Hive Studios d.o.o.
    Software Craftsman
    MVP For Visual C# MCAD MCSD MCDBA MCT

    Filed under:
    • Post Points: 29
  • 12-21-2009 11:00 In reply to

    Re: Form.Dispose() problem

    A da li bi mogao da mi pojasnis sto se tacno podrazumijeva pod strong referencom? Recimo, da li je strong referenca na drugu formu to sto sam na prvoj formi napravio instancu druge?

    Meni se cini da je jedina strong referenca koju imam u ovoj situaciji jedna promjenjiva tipa int koja je deklarisana kao public na prvoj formi i sluzi kao parametar za stored proceduru koja se poziva na drugoj formi. Moze li to da uzrokuje problem?

    Dalje, pokusao sam da u Form2_FormClosed eventu dodam this.Dispose() i da pozovem GC sa GC.Collect() al opet nista.

    Zelio bih da postignem da se nakon zatvaranja druge forme MemUsage vrati na isto ili priblizno isto stanje koje je bilo prije otvaranja druge forme. Da li je to uopste moguce?

    • Post Points: 7
  • 01-19-2010 18:09 In reply to

    Re: Form.Dispose() problem

     Ivane jel ovo pitanje za 1 000 000 dolara?

    Mislim da je pogrešno mišljenje da metod Dispose() na nekom objektu služi za unitštavanje tog objekta.

    Metod Dispose() služi za uništavanje resursa nekog objekta, ne i samog tog objekta.

    Jako bitno je zanati da GC, ne zana sta je to IDisposable interfejs i samim tim ne ume da pozove metod Dispose() !!!

    Kada pokušaš da zatvoris drugu formu (Form 2), metod Dispose() će biti momentalno pozvan. To može da se proveri tako što

    se pretplatimo na event Disposed.

     

     

     

    public

     

    Form2()

    {

             InitializeComponent();

     

     

             this.Disposed += new EventHandler(Form2_Disposed);

    }

     

     

    void Form2_Disposed(object sender, EventArgs e)

    {

     

    }

     

     

     To samo znači da će uništavanje resursa forme f2 biti pozvano odmah, nakon što korisnim krene da zatvori formu.

    To ne znači da će GC uništiti f2. To će se desiti nekad u budućnosti.

    Misim da je Net. Memory Profiler koga smo tako mnogo koristili, mnooooogo pouzdaniji od TaskManager-a.

    • Post Points: 29
  • 01-25-2010 10:36 In reply to

    Re: Form.Dispose() problem

    OK, ako Dispose() markira memorijske resurse nekog objekta da kasnije budu prebrisani GC-om da bi se mogli ponovo upotrijebiti, kako postici da se odma nakon Dispose() resursi koje je zauzimala Form2 vrate na stanje prije nego sto je forma otvorena? Probao sam naravno sa GC.Collect() cisto da vidim oce li da radi i opet nista.

    • Post Points: 29
  • 01-26-2010 11:43 In reply to

    Re: Form.Dispose() problem

     Program Net. Memory Profiler, koji sam pomenuo, može da ti tačno pokaže, koliko instanci klase Form2 trenutno imaš. Iz tog programa takođe možeš da pozoveš GC da uradi Colect(), nakon što zatvoriš instancu Form2. Ako nakon zatvaranja Form2 i pozivanja Colect() iz Net. Memory Profiler - a, i dalje imaš živu instancu klase Form2, to znači da u aplikaciji postoji memory leack (Onda počneš da rešavaš taj problem). Jedino na ovja način možeš da na jasan način pogledaš šta se dešava, pošto posmatranje Task Mangera u ovom slučaju ne mora da bude tačno, npr ako se memorija povećela u TaskManger-u, to ne mora da znači da instanca klase Form2 nakon GC.Collect(), nije ubijena, već da se možda desilo nešto drugo. Ali sa programom Net. Memory Profiler situacija je skroz jasna.

    • Post Points: 29
  • 01-27-2010 10:38 In reply to

    Re: Form.Dispose() problem

    Hvala puno! Nabavio sam Net Memory Profiler i ispitacu.

    • Post Points: 7
Page 1 of 1 (7 items) | RSS
Powered by Community Server (Commercial Edition), by Telligent Systems