Problém s vytvorením triedy   zodpovězená otázka

VB.NET, WinForms

Dobrý večer, mám problém s vytvorením triedy. Niekedy sa mi Trieda sa niekedy vytvorí a niekedy nie. Spúšťam ju pomocou buttonu a niekedy musím 3x klepnúť na button aby sa spustila.

Ďakujem

Vo formulári mám nasledovný kód:

Private Sub ExtrakciaDát()

  Me.Label2.Text = "Predchádzajúce hodnoty vymazané"
  Dim OrSR As New ObchodnyRegister
  Me.Label2.Text = "OrSR vytvorený"

  OrSR.Dispose()
  OrSR = Nothing

End Sub

Triedu mám nasledovú

Public Class ObchodnyRegister
    Implements ICompanyData, IDisposable


Public Sub New()

End sub

   Private disposedValue As Boolean = False        ' To detect redundant calls

    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO: free other state (managed objects).
            End If

            ' TODO: free your own state (unmanaged objects).
            ' TODO: set large fields to null.
        End If
        Me.disposedValue = True
    End Sub

#Region " IDisposable Support "
    ' This code added by Visual Basic to correctly implement the disposable pattern.
    Public Sub Dispose() Implements IDisposable.Dispose
        ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Třída se vytvoří vždy při zavolání metody ExtrakciaDát a po skončení této metody také zanikne, takže téměř okamžitě. Nechápu proč implementujete rozhraní IDisposable, když třída neobsahuje žádný unmanaged kód, který by bylo potřeba explicitně uvolňovat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Třída se vytvoří? Snad objekt, ne? A zanikne až v okamžiku, kdy se GC uráčí se spustit (což je většinou v okamžiku, kdy naalokuje více paměti).

A co znamená někdy musím klepnout 3x na button, aby se spustila? Co aby se spustilo? Když klepnete na tlačítko, vykoná se kódu uvnitř procedury, za předpokladu, že nějak divně nenastavujete envent handlery.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Úplně přesně by to mělo být "instance třídy se vytvoří". Přesný algoritmus GC neznáme ani jeden, ale jisté je, že v momentě OrSR = Nothing už na instanci třídy neukazuje žádná reference a garbage kolekce může proběhnout každým okamžikem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přesný algoritmus sice neznáme, ale je obecně známo, že GC se spouští na vždy při zaplnění heapu generace 0. Vzhledem k tomu, že heap 0 má nějakou definovanou pěvnou velikost (která pochopitelně závisí na použité platformě) a že GC heap 0 vždy úplně vyprázdní, dá se s jistotou tvrdit, že GC se spustí po naalokování určitého množství paměti od poslední garbage collection.

Obecně je snaha, aby se GC spouštěl co nejméně, protože při kolekci se musí pozastavit všechna vlákna aplikace.

Více informací třeba v článku http://msdn.microsoft.com/en-us/magazine.... Škoda, že tam není uvedena konkrétní velikost heapu 0, docela by mě zajímala, aspoň na nejběžnějších platformách.

A btw nastavovat do proměnné Nothing, když se stejně na dalším řádku při skončení metody zruší, je taky zbytečné.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zle som sa vyjadril, mám problém s vytvorením instancie triedy.

Ako som napísal sub sa spúšťa tlačítkom a niekedy keď ho 5 x stlačím tak sa vždy vytvorí a všetko je tak ako má byť, ale niekedy stlačím a dostanem sa len po

Me.Label2.Text = "Predchádzajúce hodnoty vymazané"

preto usudzujem že sa inštancia trieda nevytvorí a

 Me.Label2.Text = "Predchádzajúce hodnoty vymazané"
  Dim OrSR As New ObchodnyRegister
  Me.Label2.Text = "OrSR vytvorený"

keď po chvíli stlačím tlačítko tak to zase pracuje tak ako má.

Implementácia IDisposable už bol pokus zo zúfalstva, ale nepomohol.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Podle čeho usuzujete, že se instance nevytvoří? Dojde snad k nějaké vyjímce nebo co?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Usudzujem to len z toho že sa nedostanem po

Me.Label2.Text = "OrSR vytvorený"

Výnimky som zatial neriešil. Používam to na vyberanie dát zo www.stránky. Keď je stránka nahraná tak sa automaticky spustí cez udalosť a keď sa nespustí tak tam mám to tlačítko kde si to spustím ja. Výnimku by som hladal ak by sa mi to ani raz nespustilo, ale sa spusti na hoci na 2, 3 ... krát.

Ale to je možno iba moja naivná predstava...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jak nedostane?! Buď se to tam nedostane kvůli vyjímce na některých řádcích předtím, nebo se ta metoda ani neprovede. Dejte si Breakpoint na příslušný řádek a uvidíte jestli se to tam dostalo nebo ne.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Mal ste pravdu bola tam výnimka. Ďakujem

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback