Gjest Skrevet 30. april 2013 Del Skrevet 30. april 2013 (endret) Heisann, sitter å programmerer litt i vb.net - og skal ærlig innrømme at dette med Parallel i nye .NET 4.0 er nytt for meg. Er en stund siden jeg jobbet med .NET sist og da var det 3.5 eller 2.0 som gjaldt.. Her i hvert fall deler av koden som jeg ønsker ÉN tråd på som kjører og ikke blokkerer GUI - men man kan se at det blir lagt til objekter LIVE i en CheckListBox: CheckedListBox1.DataSource = datablader Dim a1 As Task = New Task(Sub() Parallel.ForEach(Of String)(Directory.EnumerateFiles("D:\datablader\datablader som skal merkes", "*.pdf"), Sub(f) Dim strFileName As String = Path.GetFileName(f) Dim datablad As datablad oRng = oSheet.Range("D2:D200") Dim rCell As Excel.Range For Each rCell In oRng.Cells Dim strNavn As Excel.Range = rCell.Offset(0, -3) Dim strNummer As Excel.Range = rCell.Offset(0, -1) If (Not (IsNothing(strNavn.Value)) And Not (IsNothing(strNummer.Value)) And Not (IsNothing(rCell.Value))) Then If (Not strNavn.Interior.ColorIndex = 35 And Not strNavn.Interior.ColorIndex = 38) Then If rCell.Value.ToString.ToLower.Contains(strFileName) Then datablad = New datablad(strNavn.Value, strNummer.Value, strFileName) datablader.Add(datablad) Exit For End If End If End If Next rCell End Sub) End Sub) a1.Start() CheckedListBox1.DisplayMember = "ListBoxDisplayValue" CheckedListBox1.ValueMember = "DisplayValue" Er det noen som er villig til å hjelpe meg å rette mine feil? Endret 30. april 2013 av Gjest Lenke til kommentar
The Jackal Skrevet 16. mai 2013 Del Skrevet 16. mai 2013 Hva er det du egentlig sliter med her? Strengt tatt ikke noe som bør blokke her siden du kjører det i en Task. Lenke til kommentar
Wedvich Skrevet 22. mai 2013 Del Skrevet 22. mai 2013 Om du vil unngå å blokkere UI-tråden, er det bedre å bruke events til å oppdatere listen enn å legge til items direkte fra innsiden av løkken. Progress-klassen i .NET 4.5 gjør det veldig greit å få til. Bruker ikke VB.NET selv, men her er et eksempel i C# som burde være passe greit å oversette: ... CheckedListBox1.ItemsSource = datablader; var progress = new Progress<datablad>(); progress.ProgressChanged += ( s, item ) { datablader.Add( item ); }; Task.Run( () => LoadItems( progress ) ); ... Og så kan du foreta innlastingen i funksjonen nevnt over: private void LoadItems( IProgress<datablad> progress ) { Parallel.ForEach( Directory.EnumerateFiles( @"D:\datablader\datablader som skal merkes", "*.pdf" ), ( f ) => { ... datablad = new datablad( strNavn.Value, strNummer.Value, strFileName ); progress.Report( datablad ); ... }; } Lenke til kommentar
The Jackal Skrevet 22. mai 2013 Del Skrevet 22. mai 2013 Det er ikke noe automatikk at en event ikke blokker UI tråden. En event blir kjørt på samme tråd som den blir invoket fra og vil blokke med mindre man eksplisitt kjører den på en annen tråd. Bruken av Progress hjelper deg egentlig bare å marshale tilbake til UI tråden, om den blir initiert på riktig tidspunkt, hvis oppdatering av UI krever det. Man kan like godt bruke SynchronizationContext eller BeginInvoke for akkurat det samme, så slipper man å dille rundt med eventhandlere. Lenke til kommentar
Wedvich Skrevet 23. mai 2013 Del Skrevet 23. mai 2013 Du har helt rett Jackal, jeg vet ikke hva jeg tenkte med. Så lenge UI'en skal oppdateres, vil tråden uansett bli kvelt når oppdateringene kommer hyppig nok. Det som kan være en mulig løsning da, er å kombinere events med Rx (Reactive Extensions) og bruke throttling/bufring der for å få det til å se ut som om UI'en oppdateres "live", men likevel redusere arbeidsmengden til UI-tråden nok til at den klarer å ta unna det som kommer. Bart De Smet fra Microsoft hadde en fantastisk presentasjon på en tidligere TechEd som bør få deg inn i Rx, ColdIce. Den er litt lang (85 min), men det er det verdt, for der får du en praktisk gjennomgang inkludert kode til nettopp hvordan du kan bruke bufring/throttling av events til å oppdatere UI'en uten at tråden blir klemt i hjel av arbeidsmengden. Link: http://channel9.msdn...ope/2012/DEV413 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå