Gå til innhold

BackGroundWorker - feil når jobben er fullført


Anbefalte innlegg

Jeg har en backgroundworker (fra nå av bgw) som arbeider seg gjennom en laaaang liste med ord, og legger dem til i en listbox. Dette går fint, men når jobben er fullført, henger formen som inneholder listboxen seg opp.

 

Hvis jeg derimot legger til

Do
[...].Doevents()
Loop

 

På slutten av BGW_DoWork, slik at den aldri blir ferdig, så oppfører alt seg helt greit. Men dette er jo overhodet ikke optimalt, da jeg feks aldri kan sjekke om den er ferdig med jobben, fordi den faktisk må loope hele tiden. Og så bruker det vel en del systemprosess.

 

Så hvordan avslutter jeg en bgw-jobb?

 

PS: Jeg har prøvd bgw.CancelAsync, med WorkerSupportsCancelation som true.

 

Hugeflis

Lenke til kommentar
Videoannonse
Annonse

Her er hele koden:

(dersom dere har forslag til optimalisering er det velkommen, da dette tar ca ett minutt (det er en ordliste med litt over 100 000 ord, 1,14mb).)

 

    Private Sub BGW_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
       Dim AntProv As Integer
       Ordliste.Show()
       Ordliste.Visible = True
       On Error GoTo Provigjen
Provigjen:
       AntProv += 1
       If AntProv > 9 Then GoTo Virkelegerror
       Dim OrdBokVal As String = OpneTekst2("ordbok\" & OrdBokSprak & ".txt")
       Dim OrdBokOrd() As String = Split(OrdBokVal, " ")
       OrdBok = New Dictionary(Of String, String)
       Dim TempOrd() As String
       Ordliste.ListBox3.Items.Clear()
       For i = 0 To UBound(OrdBokOrd)
           TempOrd = Split(OrdBokOrd(i), "/")
           OrdBok.Add(i, TempOrd(0))
           Ordliste.ListBox3.Items.Add(TempOrd(0))
           My.Application.DoEvents()
       Next
       GoTo enden
Virkelegerror:
       MsgBox("Feil!")
enden:
   End Sub

 

Koden fungerer fint hvis jeg setter den i en vanlig sub, feks på en knapp. Men poenget er jo at den skal arbeide i bakgrunnen...

 

Hugeflis

Endret av Hugeflis
Lenke til kommentar

Se hva som skjer om du legger på en RunWorkerCompleted handler i tillegg til DoWork handler. Se om denne kalles før ting fryser. På eventhandler metoden for RunWorkerCompleted kan du slenge inn et breakpoint og finne ut hvor ting henger seg om den kom dit.

 

Ellers for optimalisering. Fjerne My.Application.DoEvents for hvert eneste ord. Tror listen vil blir refreshet visuelt for hvert eneste element. Evt ta doevents per 1000 ord f.eks.

 

Om ikke bruker skal trykke noe som helst på den formen din eller trenger å se at du laster alt, fjern doevents helt. Dette skjer på en egen tråd (backgroundworker) så da trenger du strengt tatt ingen doevents.

 

ListBox3.BeginUpdate før du populerer den og ListBox3.EndUpdate når du er ferdig. Da fryser du selve tegningen av listboksen mens du fyller den slik at den ikke flimrer i vei og tar CPU ressurser.

 

EDIT:

Det kan tenkes at ting feiler fordi du kjører opp formen i en background worker?

Jeg ville ha åpnet denne formen før jeg kallte RunWorkerAsync. Deretter ville jeg fjernet

Ordliste.Show()

Ordliste.Visible = True

og

Ordliste.ListBox3.Items.Add(TempOrd(0))

My.Application.DoEvents()

fra DoWork.

Så ville jeg lagt til RunWorkerCompleted handler. Denne ville da tatt en ListBox3.BeginUpdate, fyllt listbox3 med verdier fra OrdListe Dictionaryen din og avsluttet med ListBox3.EndUpdate

 

Prøv å unngå direkte manipulering av GUI elementer fra en backgroundworker. Bk backgroundworker til å samle informasjon og når den er ferdig lar du RunWorkerCompletet ta seg av det som skal oppdateres på GUI. RunWorkerCompletet kjører på samme tråd som DoWork ble startet fra.

Endret av wolf5
Lenke til kommentar

Takk, wolf5. De doeventsene var der bare for at jeg skulle kunne følge litt med. Det andre du bemerket skal jeg likevel prøve.

 

Men hvordan looper jeg gjennom dictionaryen min?

 

For each item as --- in ordbok

 

Next [/code

 

?

 

Hugeflis

Endret av Hugeflis
Lenke til kommentar

Nei, det kom slik jeg viste (lignende, i hvert fall; det var tatt ut fra hukommelsen), noe som var en sammenslåing av ordbok-itemet kvp sin type og value. Men jeg løste det ved å skrive [...].add(kvp.value).

 

Takk for all hjelp!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...