Avatar billede jakobg Nybegynder
16. juni 2005 - 23:38 Der er 8 kommentarer og
1 løsning

Timeouts eller overflow problemer

Jeg har lavet en funktion, som kalder sig selv gentagne gange. Den fungerer fint, men mit problem er at webserveren tilsyneladende vurderer at funktionen er gået i en uendelig løkke og derfor afbryder.
Der vises "Server Application Unavailable" med store røde bogstaver (altså ikke den normale ASP.NET fejl-side).

Funktionen indeholder en "fail-safe" som vil afbryde hvis den virkeligt ER gået i selvsving, så jeg vil egentligt gerne bare få webserveren til at holde op med at blande sig. Kan det lade sig gøre? Eller evt. bare øge grænsen for hvornår den lukker funktionen ned.
Det er faktisk meningen at funktionen skal blive ved med at stå og køre indtil den har fundet en løsning, og det kan meget nemt være en tidskrævende proces.

Jeg har været meget omhyggelig mht. brugen af variable, men jeg tør alligevel ikke udelukke at der er en memoryleak et eller andet sted (og som evt. udløser ovenstående fejl).
Er der en måde at holde øje med den slags når man debugger med VS.NET 2003?

På forhånd mange tak for hjælpen! :)
Avatar billede snepnet Nybegynder
18. juni 2005 - 14:12 #1
hej jakob :o)
umiddelbart lyder det som noget du bør lægge i en proces (tråd) for sig, således at din du generer din respons inden for kort tid, og så med en mulighed for at forespørge på processen, enten ved knaptryk eller automatiks med noget XmlHttp.
så kommer brugeren ikke til at vente, og der kommer nok heller ikke noget brok over at der ikke er genereret en respons inden for udløbstiden.
du kan bare spørge løs, hvis du synes det kunne være en acceptabel fremgangsmåde - så kan du godt få eksempler på ovenstående.
mvh
Avatar billede jakobg Nybegynder
21. juni 2005 - 23:40 #2
Hej Snepnet,

Tak for dit svar.

Jeg har fundet en alternativ løsning på problemet, men hvis du har nogle interessante links hvad angår at starte opgaven som en seperat process, vil jeg meget gerne se nærmere på det. Du behøver ikke komme med kodeeksempler.

Smid et svar, så er der point til dig.

Tak for hjælpen... :)
Avatar billede snepnet Nybegynder
29. juni 2005 - 20:36 #3
det var bestemt så lidt - et svar får du her :o)
mvh
Avatar billede snepnet Nybegynder
28. juli 2005 - 18:35 #4
hej jacob - kan vi lukke her?
mvh
Avatar billede snepnet Nybegynder
28. juli 2005 - 18:37 #5
hmm... egentlig skal du jo bare selv tage pointene :o)
... er du stadig interesseret links/kode til at starte processer?
mvh
Avatar billede jakobg Nybegynder
28. juli 2005 - 21:23 #6
Jo tak, hvis du har et par links ville det da være pænt af dig...

På forhånd tak! :)
Avatar billede snepnet Nybegynder
30. juli 2005 - 00:51 #7
hej igen :o)

som udgangspunkt er det meget enkelt at starte en process op i .net
her et link : http://www.c-sharpcorner.com/Code/2005/April/Thread.asp

og... så kan du få et eksempel her, hvor der er lidt med callback, samt egne delegates og argumenter - lidt andre ting end der er dækket i artiklen.
og ellers er det jo bare at lave sådan en her:
http://www.google.dk/search?hl=da&q=.net+C%23+threading&meta=

// ThreadDifinitions er bare en klasse, hvor der ligger en metode du gerne vil eksekvere i en tråd for sig.
// læg mærke til, at der gives en delegate med i constructoren, og det bliver via den muligt at realisere callbacks
// CallBackReciever er metoden der står lidt længere nede.
ThreadClass threadObject= new ThreadClass(new ThreadCallBack(CallBackReciever));       

// selve tråden - metoden Procedure eksekveres, i ThreadClass-objektet.
Thread thread = new Thread(new ThreadStart(threadObject.Procedure));
thread.Start();

// metoden der modtager callbacks fra tråden
public void CallBackReciever(string threadId, ThreadCallBackEventArgs e)
{
  if(e.PercentComplete == 100)
  {
    // ..
  }
  else
  {
    // ..
  }
}

selve threadklassen ser ud som følger ... den laver noget pjat, men på en måde så du kan modtage statusmeldinger fra den undervejs som "arbejdet" udføres.

// en threadingprocedure
public class ThreadClass
{
        // lidt konstanter, så du kan styre eksekveringen
    private const int ITEMS = 1500;
    private const int SLEEPTIME = 20000;
    private const int DIV = 10;
   
    // til at holde callbackdelegaten
    private ThreadCallBack callBack;

        // constructor
    public ThreadClass(ThreadCallBack callBackDelegate)       
    {
        callBack = callBackDelegate;
    }

        // selve proceduren
    public void Procedure()
    {
        DateTime startTime = DateTime.Now;
            int percentComplete = 0;
            int itemsDone = 0;           

        for(int i=0;i<DIV;i++)
        {
                // lille pause - ellers fræser den bare igennem inde du kan nå at sige "Ib"
            Thread.Sleep(SLEEPTIME/DIV);
           
            // angivelse af hvor meget der er sket
            percentComplete = 100 - ((DIV-(i+1))*(100/DIV));
            itemsDone = (i+1)*(ITEMS/DIV);
           
            // og så kald via delegaten - så status kan modtages i callback-handleren
            if(callBack!=null)
            {
                callBack(Thread.CurrentThread.Name, new ThreadCallBackEventArgs(percentComplete, itemsDone, DateTime.Now - startTime));
            }
        }
    }
}

for lige at få det hele med, bruges der så en customdelegate, og et customargument som følger :

// delegate
public delegate void ThreadCallBack(string threadId, ThreadCallBackEventArgs e);

// og argumentet
// custom threadstateargument
public class ThreadCallBackEventArgs : System.EventArgs
{
    private int _percentComplete;
    private int _numberOfItemsDone;
    private TimeSpan _executionTime;

    public int PercentComplete
    {
        get{return _percentComplete;}
    }

    public int NumberOfItemsDone
    {
        get{return _numberOfItemsDone;}
    }

    public TimeSpan ExecutionTime
    {
        get{return _executionTime;}
    }

    public ThreadCallBackEventArgs(int percentComplete, int numberOfItemsDone, TimeSpan executionTime)
    {
        _percentComplete = percentComplete;
        _numberOfItemsDone = numberOfItemsDone;
        _executionTime = executionTime;
    }
}

håber du hermed har fået lidt at komme videre på.

mvh
Avatar billede jakobg Nybegynder
30. juli 2005 - 01:10 #8
Tusind tak, jeg har helt klart fået noget inspiration: Mange tak for hjælpen!!!

:)
Avatar billede snepnet Nybegynder
30. juli 2005 - 02:29 #9
det var så lidt :o)
mvh
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