Avatar billede jimmidreng Nybegynder
23. oktober 2003 - 19:00 Der er 19 kommentarer og
1 løsning

Class der forbliver i hukommelse under session

Jeg har lavet en class som indeholder en masse data jeg har loadet i hukommelsen. Det er jo perfekt i en vb.net app, da jeg kan manipulere og gøre ved uden at den "smider" klassen.
Men i ASP.net forsvinder mine instanser jo ved hvert update.
Mit spørgsmål er så, hvordan kan jeg få klassen til at forblive i hukommelsen hen over en session?
I layout klassen laver jeg en:
Public Users as new User_collection()

i Page_load har jeg en:
if ispostback = false then
  Users.loadall()
end if

Denne collection holder alle mine brugere, men det dutter jo ikke at jeg skal hente dem hver gang siden loader.

Er det til at forstå hvad jeg mener?
Avatar billede arne_v Ekspert
23. oktober 2003 - 19:02 #1
Det burde:

Public Shared Users as new User_collection()

løse !
Avatar billede jimmidreng Nybegynder
23. oktober 2003 - 19:05 #2
Og hvordan initierer jeg den så igen for at holde instansen?
Public Shared Accounts As clsAccount() laver vel bare en ny instans når siden loades?
Avatar billede arne_v Ekspert
23. oktober 2003 - 19:08 #3
Nej.

Shared skulle kun blive instantieret når klassen loades ikke
når instanser af klassen loades.
Avatar billede jimmidreng Nybegynder
23. oktober 2003 - 19:13 #4
Jammen i asp.net har jeg jo; Public Class layout
som vel bliver instantieret hver gang siden loades ikke?

Lad mig omformulere lidt så.
Hvordan instantiere jeg i webform koden nedenfor min user_collection én gang, og sidenhen benytter den samme instans?

Public Class WebForm1
    Inherits System.Web.UI.Page

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)     Handles MyBase.Load
        'Put user code to initialize the page here
    End Sub

End Class

Class User_collection
    bla bla
end class
Avatar billede arne_v Ekspert
23. oktober 2003 - 19:14 #5
Et lille eksempel med Shared:

Imports System

Public Class Test
    Private Dim v1 As Integer = 0
    Private Shared Dim v2 As Integer = 0
    Public Sub New()
        v1 = v1 + 1
        v2 = v2 + 1
    End Sub
    Public Sub Show()
        Console.WriteLine(v1 & " " & v2)
    End Sub
End Class

Module Main
    Sub Main()
      Dim test1 As Test = New Test()
      test1.Show()
      Dim test2 As Test = New Test()
      test2.Show()
      Dim test3 As Test = New Test()
      test3.Show()
    End Sub
End Module

Output er:

1 1
1 2
1 3

Fordi v2 kun bliver instantieret en gang.
Avatar billede arne_v Ekspert
23. oktober 2003 - 19:18 #6
Så hvis du hare en Shared variabel og du loader den en gang, så
bør du kunen bruge den fremover.
Avatar billede jimmidreng Nybegynder
23. oktober 2003 - 19:20 #7
Ok, jeg leger lige lidt med det, så får du dine points.
Kan jeg få dig til at skrive det ind i webform koden jeg skrev ovenover?
Jeg har leget med shared variabler i en vb.net app før, og det kan jeg sagtens få til at funke. Men virker det med en shared class i asp.net...
Avatar billede arne_v Ekspert
23. oktober 2003 - 19:20 #8
Hvis du skal have et objekt per bruger session må jeg melde
pas p.g.a. manglende ASP.NET kundskaber.
Avatar billede arne_v Ekspert
23. oktober 2003 - 19:23 #9
Hvis du sætter Shared på den variabel du vil dele på tværs af instanser,
så bør det også virke i ASP.NET !
Avatar billede jimmidreng Nybegynder
23. oktober 2003 - 19:23 #10
Det er lige præcist det jeg skal. Den må ikke instantieres igen, for så smider den jo data. Og det skal foregå over flere page loads. Alle sammen på samme side, men stadigvæk.
Avatar billede jimmidreng Nybegynder
23. oktober 2003 - 19:24 #11
Det er ikke én variabel, det er ca. 10 i hver klasse. Og derunder klasser som er bundet på.
Avatar billede arne_v Ekspert
23. oktober 2003 - 19:27 #12
Jo men hvis du laver en klasse med al den info (1, 10 eller 100
variable) og så laver 1 Shared instans af den klasse, så bør det virke.
Avatar billede jimmidreng Nybegynder
23. oktober 2003 - 19:32 #13
Lyder fornuftigt, tester det nu. Giv mig lige en halvt times tid :-)
Avatar billede jimmidreng Nybegynder
23. oktober 2003 - 19:44 #14
Det virker faktisk, men desværre næsten for godt :-(
For den sharer hen over sessions.
Jeg lavede en lille test.

        Public Shared UsersLoaded As Boolean = False

        if IsPostBack = False And UsersLoaded = False Then
            Response.Write("BRUGERE LOADET!")
            UsersLoaded = True
        Else
            Response.Write("GAMLE BRUGERE")
        End If
Avatar billede arne_v Ekspert
23. oktober 2003 - 19:49 #15
Ja - den sharer på .NET niveau.

Hvis du skal share på ASP.NET session niveau så skal du have gemt
objektet i sessionen.

Og det kræver ASP.NET know-how, hvad jeg ikke har.
Avatar billede odegaard Nybegynder
23. oktober 2003 - 21:15 #16
Hvad med at gemme den i en Application variabel i stedet?
Avatar billede jimmidreng Nybegynder
23. oktober 2003 - 22:42 #17
Hej alle, jeg løste sgu problemet tidligere på aftenen. Løsningen var en ganske almindelig session variabel. Jeg anede ikke at man kunne gemme en aktiv klasse med bundede sub klasser og hele møjet i en session variabel. Var faktisk så overbevist at jeg slet ikke havde prøvet. Dumt :-) Tak for forskellige svar i denne her. arne_v hvis du lige laver et svar, så smider jeg dig nogle point! Odegaard, man kan sige at du var tæt på, men at smide den i en application variabel gør jo faktisk i praksis det samme som en shared erklæring.
Avatar billede arne_v Ekspert
23. oktober 2003 - 22:46 #18
svar (igen - tror jeg)
Avatar billede jimmidreng Nybegynder
23. oktober 2003 - 22:53 #19
Super!
Avatar billede odegaard Nybegynder
24. oktober 2003 - 01:00 #20
ok, jeg troede faktisk du mente en variabel der indeholdt det samme uanset brugersession. Men ja, så er Session jo i stedet svaret. Problemet med Sessions er at hvis du gemmer store objekter her i, så kan det hurtigt sluge en masse resourcer, hvis du har mange brugere samtidigt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester