Avatar billede rmjdk Nybegynder
26. februar 2009 - 14:28 Der er 6 kommentarer og
1 løsning

Problem med BackgroundWorker

Jeg har en BackgroundWorker som - sjovt nok - udfører noget logik via DoWork eventet, jeg har tilknyttet en metode til RunWorkerCompleted eventet som skal udføres efter DoWork er færdig (det handler om at opdatere noget tekst i en TextBox).
Problemet er at RunWorkerCompleted bliver udført FØR DoWork er færdig, og teksten ("Done...") bliver sat random ind midt i tekst-status-TextBoxen.

asyncWorker.DoWork += Write;
asyncWorker.RunWorkerCompleted += FinishedWriting;

asyncWorker.RunWorkerAsync();

FinishedWriting metoden bliver altså kaldt "midt i" udførslen af Write.

Nogen idéer?
Avatar billede speedy Nybegynder
26. februar 2009 - 14:54 #1
Det kunne være fordi der sker en exception inde i din "Write".

Prøv at lave et break point i starten af FinishedWriting og kig på parametren "e" af typen RunWorkerCompletedEventArgs og se på om property'en "Error" indeholder en exception eller noget.
Avatar billede rmjdk Nybegynder
26. februar 2009 - 16:52 #2
speedy, jeg har nu debugget lidt og Error er null.

Jeg har kørt den igennem mange gange nu, og det er ikke et konsekvent tidspunkt den hopper over i FinishedWriting.

Hvad dælen kan det være?
Avatar billede speedy Nybegynder
26. februar 2009 - 16:57 #3
Hmm...det lyder mærkeligt.

Ved du om den så fortsætter med at arbejde i din Write metode selvom den har kaldt FinishedWriting ?
Avatar billede arne_v Ekspert
26. februar 2009 - 17:14 #4
prøv og synkroniser Write og FinishedWriting med en lock på samme objekt.
Avatar billede rmjdk Nybegynder
27. februar 2009 - 14:18 #5
speedy, ja den fortsætter med Write metoden efter FinishedWriting er completed.

arne_v, jeg må nok have lidt mere forklaring på den. Write og FinishedWrite arbejder ikke med samme objekt(er) - udover at blive kaldt gennem den samme worker selvfølgelig.

Iøvrigt, FinishedWrite metoden kalder Dispose() på workeren - hvordan kan workeren så kører videre i Write ?
Avatar billede arne_v Ekspert
28. februar 2009 - 04:36 #6
Har du mulighed for at lave et komplet eksempel som kan illustrere problemet (uden alt det som ikke er relevant) ?
Avatar billede rmjdk Nybegynder
03. marts 2009 - 13:46 #7
Så fandt jeg selv ud af det. Jeg havde begået den fejltagelse, at min time-consuming task (Write()) benyttede en tråd til at udføre sit arbejde hvilket vil sige at metoden var færdigudført før det egentlige arbejde var færdigt, dermed blev FinishedWrite() kaldt for tidligt :)

Jeg takker for hjælpen - men nupper selv pointene hehe :D
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