» »

[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:

    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:
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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[VB.NET] class

Oddelek: Programiranje
8727 (634) korenje3
»

vb.net: dynamic textbox

Oddelek: Programiranje
51181 (1071) saule
»

[C#] Prosim pomagajte! Potrebujem program, ki bi pobiral podatke iz ene strani

Oddelek: Programiranje
212747 (2357) David1994
»

[VB] Komunikacija s serijskimi napravami

Oddelek: Programiranje
412309 (1583) mNeRo
»

Akcije nad grafiko v VB

Oddelek: Programiranje
81271 (1084) damijani

Več podobnih tem