Avatar billede emkay Nybegynder
28. marts 2009 - 16:36 Der er 17 kommentarer

Gemme tidspunkt for hvornår en Timer er kørt i App_Code. Måske med Application("Time") = Now...?

Hej

Jeg forsøger forgæves at sætte en Application property i min App_Code.

Det er en Timer, der kører med et vist interval uafhængigt af brugeres requests. Timeren bliver startet ved Application_Start i global.asax.

Nogle gange den bliver kørt skal noget kode udføres og derefter skal der sættes en Application variabel med tidspunktet, så jeg næste gang kan se hvornår koden sidst er blevet udført. Hvordan gør man det?
For min skyld behøver det egentlig ikke at være en Application property. Jeg vil helst bare undgå at gemme informationen i en txt-fil eller en database, da jeg har en ide om at det er lidt hurtigere for serveren hvis det ligger i noget af .NET's egen funktionalitet.
Avatar billede arne_v Ekspert
28. marts 2009 - 16:38 #1
Hvordan ser den kode ud som du har forsøgt med og hvilken fejl får du ?
Avatar billede emkay Nybegynder
28. marts 2009 - 16:53 #2
Den her bliver kørt ved Application_Start:
    Public Sub starttimer()

        Dim myTimer As New Timers.Timer
        Dim intMseconds As Integer = 60000

        myTimer.Interval = intMseconds

        AddHandler myTimer.Elapsed, AddressOf timerhandler
        myTimer.Enabled = True
        myTimer.AutoReset = True

    End Sub

timerhandler ser så sådan her ud:

Sub timerhandler()
Application.Lock()
Application("Test") = "Application started"
Application.UnLock()
End Sub


Men det virker ikke. Jeg kan ikke sætte Application("Test"), når det ikke er et request fra en bruger. Får ikke nogen fejl, da det er jo er serveren, der kører det og ikke et request fra en browser.
Avatar billede arne_v Ekspert
28. marts 2009 - 17:04 #3
Hvordan ved at det ikke virker ?
Avatar billede emkay Nybegynder
28. marts 2009 - 17:23 #4
Hvis jeg prøver at skrive Application("Test") ud på en alm. side har den ikke fået tildelt nogen værdi..
Avatar billede arne_v Ekspert
28. marts 2009 - 17:36 #5
Det skal virke.

global.asax:

<script runat="server" language="C#">
    protected void Application_Start(object sender, EventArgs e)
    {
        Application["foo"] = "bar";
    }
</script>

show.aspx:

<%@ Page Language="C#" %>
<%=Application["foo"]%>

outputter fint "bar" hos mig.

Check koden fra Application_Start og ned !
Avatar billede emkay Nybegynder
28. marts 2009 - 17:47 #6
Jamen det er jo ikke i Application_start jeg sætter variablen, som du har vist der. Der starter jeg bare timeren, der så hver gang den kører sætter variablen. Og der er åbenbart forskel.
Avatar billede arne_v Ekspert
28. marts 2009 - 18:08 #7
Det er derfor jeg vil have dig til at checke koden fra Application_Start og ned til hvor variablen sættes.
Avatar billede emkay Nybegynder
28. marts 2009 - 18:13 #8
Jamen hvad skal jeg tjekke efter? Jeg ved jo netop ikke hvordan jeg skal sætte variablen. Koden kører skam. For lige efter at jeg på alle mulige måder har forsøgt at sætte variablen i min timer, der har jeg et par linjer, der smider et lille timestamp i en txt-fil. Og det kører fint. Så det er koden, der sætter Application-variablen, der er noget galt med. Den skal åbenbart være speciel, når det ikke er et HTTP request, men en timer, der skal sætte den.
Avatar billede arne_v Ekspert
28. marts 2009 - 18:30 #9
Du sætter med at bruge Application som du gør.

Forudsat at den kode er i den rette kontekst.
Avatar billede emkay Nybegynder
28. marts 2009 - 18:49 #10
Og hvad mener du med at den skal være i den rette kontekst?
Avatar billede arne_v Ekspert
28. marts 2009 - 18:52 #11
At metoden skal være dfineret et sted hvor Application findes.
Avatar billede emkay Nybegynder
28. marts 2009 - 19:05 #12
Jeg er stadig ikke helt med. Har du et eksempel på en kode jeg kan bruge?
Avatar billede arne_v Ekspert
28. marts 2009 - 20:14 #13
<script runat="server" language="C#">
    protected void Application_Start(object sender, EventArgs e)
    {
        Application["foo"] = "bar";
        new System.Threading.Timer(new System.Threading.TimerCallback(Upd), null, 0, 1000);
    }
    public void Upd(Object o)
    {
        Application["upd"] = DateTime.Now.ToString();
    }
</script>
Avatar billede arne_v Ekspert
28. marts 2009 - 20:15 #14
<%@ Page Language="C#" %>
<%=Application["foo"]%>
<br>
<%=Application["upd"]%>
Avatar billede arne_v Ekspert
28. marts 2009 - 20:15 #15
Det er lige ud af landevejen.
Avatar billede emkay Nybegynder
28. marts 2009 - 22:55 #16
Jeg tror jeg har fået det til at virke nu. Du kom godt nok ikke direkte med løsningen, men du fik mig da på den rette vej.
Så smid du et svar, så får du point :)
Avatar billede arne_v Ekspert
28. marts 2009 - 23:19 #17
svar
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
Kurser inden for grundlæggende programmering

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