Forum » Programiranje » [VB.NET] Life time spremenljivk
[VB.NET] Life time spremenljivk
Kovalchuk ::
Živjo,
v nekem VB.NET (.NET Framework 2.0) sem naredil class, ki skrbi za poganjanje zadev v svojem threadu (bolj natančno, BackgroundWorker-ju). Entry point je sledeča funkcija:
Parametri so taki:
Prvi je forma, na kateri se bo izvedel thread (rabim za to, da vem kje prikazat "loading" progress bar).
Drugi je vbistvu pointer na funkcijo, ki se naj izvede v svojem threadu in je sledečega tipa:
Tretji je callback, ki ga pokličem, ko BackgroundWorker konča svoje delo.
Sledita parametra za funkcijo, ki se pokliče (drugi parameter).
Sedaj to pokličem tako:
Kar me zanima je, ali je safe glede life time-a spremenljivk parameter1 in parameter2, če prestavim _worker.RunWorkerAsync() klic iz zgornje metode v svojo, ki bo jo poklical za zgornjim klicem, torej:
Ali lahko GC pobriše parameter1 in parameter2 preden jest pokličem korak 2? Ker kakor razumem, bosta po klicu StartFunctionAsync spremenljivki parameter1 in parameter2 na voljo za GC, ker bosta izven scopa metode.
Kaj pa če pustim funkcijo taka kot je, je safe?
Hvala,
Uroš
v nekem VB.NET (.NET Framework 2.0) sem naredil class, ki skrbi za poganjanje zadev v svojem threadu (bolj natančno, BackgroundWorker-ju). Entry point je sledeča funkcija:
Public Sub StartFunctionAsync(Of T1, T2)(ByVal activeForm As Form, ByVal [function] As Func(Of T1, T2), ByVal callback As Action(Of Object), ByVal parameter1 as T1, ByVal parameter2 as T2) _activeForm = activeForm _callback = callback _doWorkEventHandler = New DoWorkEventHandler(Sub(sender As Object, e As DoWorkEventArgs) e.Result = [function].Invoke(parameter1 , parameter2 ))) AddHandler _worker.DoWork, _doWorkEventHandler _worker.RunWorkerAsync() End Sub
Parametri so taki:
Prvi je forma, na kateri se bo izvedel thread (rabim za to, da vem kje prikazat "loading" progress bar).
Drugi je vbistvu pointer na funkcijo, ki se naj izvede v svojem threadu in je sledečega tipa:
Friend Delegate Function Func(Of T1, T2, TResult)(ByVal parameter1 As T1, ByVal parameter2 As t2) As TResult
Tretji je callback, ki ga pokličem, ko BackgroundWorker konča svoje delo.
Sledita parametra za funkcijo, ki se pokliče (drugi parameter).
Sedaj to pokličem tako:
MojThreadingSingleton.Instance.StartFunctionAsync(Of String, Integer, Integer)(Me, New Func(Of String, Integer, Integer)(AddressOf MojaFunkcija), new Action(Of Object)(AddressOf MojCallback), "ABC", 1)
Kar me zanima je, ali je safe glede life time-a spremenljivk parameter1 in parameter2, če prestavim _worker.RunWorkerAsync() klic iz zgornje metode v svojo, ki bo jo poklical za zgornjim klicem, torej:
' 1. MojThreadingSingleton.Instance.StartFunctionAsync(...) ' tu vmes lahko nekaj časa traja preden pokličem naslednji klic ' 2. MojThreadingSingleton.Instance.StartWorker() '// Ta bi izvedel _worker.RunWorkerAsync()
Ali lahko GC pobriše parameter1 in parameter2 preden jest pokličem korak 2? Ker kakor razumem, bosta po klicu StartFunctionAsync spremenljivki parameter1 in parameter2 na voljo za GC, ker bosta izven scopa metode.
Kaj pa če pustim funkcijo taka kot je, je safe?
Hvala,
Uroš
MrBrdo ::
Mal maš kompleksen problem, ni mi čisto jasno kaj hočeš naredit, sam dokler obstaja referenca na nek objekt ti ga GC ne bo brisal... Brez reference nanj pa ga tako ali tako ne moraš brati. Tako da pomojem ti ni treba nič skrbeti tukaj.
MrBrdo
Kovalchuk ::
Ja, sej zdej delam tako, da znotraj singletona shranim parametre, ki jih pošlje, da ohranjam referenco (just in case).
Mogoče če malo poenostavim:
Če se kliče najprej Create, potem pa Start, a ostaneta p1 in p2 nastavljena? Torej lokalno jih nič ne shranim, samo kot parametra k Action delegatu ju pošljem.
Mogoče če malo poenostavim:
public class MojClass private _th as Thread Public Sub Create(p1 as Integer, p2 as String) _th = new Thread(new Action(of Integer, String)(AddressOf NekaApplicableFunkcij),{p1,p2}) ' Ali kaj takega z anonymous funkcijo ' _th = new Thread(new Action(of Integer, String)(Sub(count as Integer, text As String) ' DoSomething(count,text) ' End Sub, ' {p1,p2}) End Sub public Sub Start() _th.Start() End Sub End Class
Če se kliče najprej Create, potem pa Start, a ostaneta p1 in p2 nastavljena? Torej lokalno jih nič ne shranim, samo kot parametra k Action delegatu ju pošljem.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [VB.NET] classOddelek: Programiranje | 727 (634) | korenje3 |
» | vb.net: dynamic textboxOddelek: Programiranje | 1181 (1071) | saule |
» | [C#] Prosim pomagajte! Potrebujem program, ki bi pobiral podatke iz ene straniOddelek: Programiranje | 2747 (2357) | David1994 |
» | [VB] Komunikacija s serijskimi napravamiOddelek: Programiranje | 2309 (1583) | mNeRo |
» | Akcije nad grafiko v VBOddelek: Programiranje | 1271 (1084) | damijani |