Avatar billede rmjdk Nybegynder
02. september 2009 - 11:56 Der er 6 kommentarer og
1 løsning

Problem med BackgroundWorker

Hejsa

Jeg har en klasse der modtager en liste af URL'er den skal lave HTTP request på, hvis der f.eks. er 10 URL'er er det smartere hvert request kører i hver sin BackgroundWorker for at spare tid.
Jeg har brugt BackgroundWorker før, og kan ikke umiddelbart spotte problemet da debuggeren stopper tilfældige steder når jeg stepper igennem.

Koden ser ud som følger:

        public void Start(object sender, DoWorkEventArgs e)
        {
            SettingsObj = (Settings) e.Argument;

            foreach (Url url in SettingsObj.Urls)
            {
                BackgroundWorker worker = new BackgroundWorker();

                worker.DoWork += worker_DoWork;
                worker.RunWorkerCompleted += worker_RunWorkerCompleted;

                Console.WriteLine("UrlRunner: Starting job '" + url.Name + "'");

                worker.RunWorkerAsync(url);
            }

            while(true)
            {
                Thread.Sleep(1000);

                if (IsFinished)
                {
                    e.Result = ExecutedUrls;

                    break;
                }
            }
        }

Som det ses startes en BW for hver URL (umiddelbart er DoWork og RunWorkerCompleted metoderne irrelevante). Start metoden kører ligeledes asynkront for at kunne signalere hvornår URL'erne er behandlet til det kaldende objekt.

Jeg har prøvet med breakpoints i DoWork metoden, men debuggeren når aldrig dertil, den plejer at stoppe eksekvering et sted i foreach() løkken (den kommer ligeledes aldrig ned til while() løkken.

Jeg håber jeg har forklaret mig tydeligt nok og at i kan hjælpe :)
Avatar billede aaberg Nybegynder
02. september 2009 - 13:13 #1
Visual Studio kan opføre sig ekstremt mærkeligt når man debugger multithreadet programkode.

Prøv dette:
I Visual Studio, gå til Tools -> Options... -> Debugging -> Generel.
(Hvis du ikke ser dette punkt i Options vinduet, tryk på "Show all settings" nede i venstre hjørne)
Disable punktet: "Enable property evaluation and other implicit function calls"

Dette fikser debuggeren så længe man skal debugge multithreaded programkode. Nu kan du prøve at debugge dig ned igennem koden igen, og se om fejlen bliver nemmere at finde.

Her kan du læse lidt mere om problemet:
http://blogs.msdn.com/greggm/archive/2005/11/18/494648.aspx
Avatar billede rmjdk Nybegynder
02. september 2009 - 14:23 #2
aaberg Perfekt! Det gjorde det muligt at finde fejlen (den feature har jeg kunnet bruge mange gange)

Takker :) smid et svar :)
Avatar billede Syska Mester
02. september 2009 - 16:03 #3
Men hvad gjorde så at der var fejl i dit program ?

Rart som læser at vide :-)

// ouT
Avatar billede rmjdk Nybegynder
03. september 2009 - 09:43 #4
Det er rigtigt buzzzzz.

Start metoden (der starter en BW pr. URL) kørte selv i en BW, men den metode der startede denne manglede en while(!IsFinished) løkke så den stoppede eksekveringen med det samme :) Det var derfor debuggeren stoppede random steder.
Avatar billede janrou Nybegynder
03. september 2009 - 13:01 #5
Hvorfor starter du en arbejds-tråd (bw) manuelt?

Kernen opretter en tråd hvergang du kalder BeginInvoke. I den kan du lægge en callback (delegate) som kaster eventen, worker_RunWorkerCompleted.

Check MSDN ud her for asynkrone kald: http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx

Så er du fri for alt det med tråde start og afslutning. Du skal bare huske at gøre din callback reentrant.
Avatar billede aaberg Nybegynder
03. september 2009 - 13:04 #6
Godt at du kunne bruge det :-)

Her kommer et svar.
Avatar billede rmjdk Nybegynder
03. september 2009 - 14:18 #7
janrou Jeg har ikke nærlæst den artikel, men om jeg starter en BW med RunWorkerAsync() eller BeginInvoke() kan vel komme ud på et?
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