webForumDet fria alternativet

Låta sidan "vila" lite?

.NET

14 svar · 513 visningar · startad av Jesper T

Medlem sedan nov. 20017 144 inlägg
Frågan#1

Om man skall göra en sida med många beräkningar och databasanrop skulle man då rent hypotetiskt vill säga, kunna lägga in en timer eller en sleep-funktion för att fördela/sprida ut belastningen. Eller tänker jag helt fel då?
Alltså jag har ingen exempelkod men jag tänker mig något liknande.

* Exekvera en massa ifrån en databas
* Utför komplicerade beräkningar
* Skicka ut en massa mail
[blue]* Vila lite :D[/blue]
* Börja om från början

Det är såklart inte sidan utan servern som skall få vila.
Men det kanske inte funkar på det viset. Vet inte hur servern belastas när en sida exekveras. Kan ju logga lite själv.

Medlem sedan juni 20019 024 inlägg
#2

Kör dina funktioner i trådar och lägg en sleep där.

Medlem sedan nov. 20017 144 inlägg
#3

Overload resolution failed

Jag får fel:

BC30518: Overload resolution failed because no accessible 'New' can be called with these arguments:

        Public Sub Dostuff_Thread()

            Dim NewThread As Thread = New Thread(AddressOf Do_stuff)
            NewThread.Priority = ThreadPriority.Lowest
            NewThread.Start()

        End Sub
Medlem sedan nov. 20017 144 inlägg
#4

Ok, jag fattar att det är något som ligger i subben Do_stuff som klickar.
Vad kan respektive kan inte ligga där?

Medlem sedan juni 20019 024 inlägg
#5

Subben Do_stuff kan inte ta några parametrar.

Medlem sedan nov. 20017 144 inlägg
#6

Ok, hajjar.
Men om jag kör ex try och catch så kommer jag ju aldrig se några eventuella felmeddelanden.
Finns det någon annan metod för det då?

Medlem sedan juni 20019 024 inlägg
#7

Du kommer aldrig att se några felmeddelanden i en trådad applikation - bortsett från loggboken (tror jag...) eller annan hemmagjord lösning.

Try...Catch kan du ju däremot alltid använda.

Medlem sedan nov. 20017 144 inlägg
#8

Ok, jag märkte att när jag tex försöker sätta in ett värde i en session så ballar det hela ur.
Vad som händer har jag ingen aning om.
Dum fråga: hur startar/hittar jag loggboken?

Medlem sedan juni 20019 024 inlägg
#9

Start > Inställningar > Kontrollpanelen > Administrationsverktyg > Loggboken.

Att pyssla med sessioner i en tråd låter som ett konstigt tillvägagångssätt. Tilldela en property session-värdet på klassen "foo" och tråda sedan subben "bar" i klassen som tar emot session-värdet som en privat medlemsvariabel.

Medlem sedan nov. 20017 144 inlägg
#10

God morgon. *gäsp*
Det är möjligt, men enligt artikeln:
http://www.sitepoint.com/print/threading-asp-net
så gör han det. Jag har ingen aning om det är bra eller dåligt.
För mig så funkar det inte när jag föröker att skicka några mail i samband med loopen.
Får inget felmeddelande i loggen heller.

Medlem sedan dec. 19991 072 inlägg
#11

Exakt vad är det du behöver sessionen till?

Istället för att använda just "Thread" så finns ju även Asynkrona anrop (med Delegater) som också körs på en ny tråd. Här kan man dock skicka med parametrar, samt så har man möjligheten att få en Callback när metoden är klar, något som du kanske kan utnyttja.

Istället för en "Sleep" som jag inte tror att du kan använda där, så kan du göra en "Wait" på ett annat anrop som i sig utnyttjar "Sleep".

Blev kanske lite flummit svar, men hoppas du förstår! :)

Jag meckade själv med just detta för ett tag sen:
http://www.webforum.nu/showthread.php?forumid=29&threadid=56986&highlight=tr�d

Medlem sedan maj 20012 812 inlägg
#12

* Exekvera en massa ifrån en databas
* Utför komplicerade beräkningar
* Skicka ut en massa mail
* Vila lite
* Börja om från början

Och detta säger dig att du INTE skall använda dig av en ASPX-sida. Det du eftersträvar är verkligen inte det som ASP.NET är tillför och du kommer få en krystad och dålig lösning.

Den bästa lösningen är en lite applikation som du schemalägger med ett visst intervall. Om intervallet är väldigt litet så kan man istället skriva en windows-service som ligger med en timer och aktiveras då och då.

Angående trådarna så kan man faktiskt fånga fel från olika trådar till sin maintråd. Kommer inte ihåg koden exakt, har den på jobbet, men det är något med ApplicationOnHandlingException eller nått tror jag.

Det bästa alternativet är ju att se till så att man i sina trådar har try-catch runt all sin kod och loggar ner eventuella fel till en logg som man kan läsa av.

Så fort man börjar med trådar så måste man tänka noga på hur man skriver sin kod, eftersom det helt plötsligt kan vara flerar trådar som försöker läsa/skriva till samma data, och detta kommer att generera fel som är väldigt svåra att hitta.

Generellt kan man säga att vid trådprogrammering så skall man inte använda några "global" variabler i sina klasser, alltså man skall endast ha variabler i sina funktioner då dessa körs i egna minnesrymder för varje tråd. Och om man har en "global klass" variable så skall man göra en lock() varje gång som man önskar läsa/skriva till/från dessa variabler.

- M

Medlem sedan nov. 20017 144 inlägg
#13

Ok, jag vet att man skulle kunna tänka sig en schemalagd aktivetet som man lägger som en service, men.
Detta kräver en dedicerad server eller att man känner sin ISP.
Detta kostar ju.
Jag har kommit ut ur garderoben (med servern ;))

Medlem sedan maj 2001431 inlägg
#14

vill du sova sidan borde du bara behöva köra

System.Threading.Thread.Sleep(1000);
Medlem sedan jan. 20012 204 inlägg
271 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)