Gå til innhold

Non-blocking tråd i vb.net


Anbefalte innlegg

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 av Gjest
Lenke til kommentar
  • 3 uker senere...
Videoannonse
Annonse

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

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

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

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...