Dlouhotrvající operace bez DoEvents
Přidáno: 19.5.2009
Kategorie: Aplikace
Autor: Ondřej Linhart
Již několikrát zde padl dotaz jak spouštět dlouhotrvající operace ve Windows Forms, aniž by došlo k zamrznutí uživatelského rozhraní (amatérské řešení je pomocí DoEvents).
Existuje několik řešení, pro začátečníka je asi nejjednodušší použít komponentu BackgroundWorker, která zajistí vše potřebné pomocí DoWork a RunWorkerCompleted.
Řešení, které vám zde ukážu má oproti BackgroundWorkeru jednu obrovskou výhodu: Můžete spouštět libovolné množství dlouhotrvajících operací současně, tedy na vícejádrovém procesoru může být zpracováváno skutečně několik úloh paralelně (BackgroundWorker dokáže pouze jednu).
Pro rozběhnutí této ukázky postačí vytvořit nový projekt typu Windows Forms Application a na výchozí formulář přidat ListBox. Aby bylo vidět dlouhotrvající zpracování úloh, klikejte libovolně na formulář a sledujte zobrazování dokončených úloh.
Imports System.Threading
Public Class Form1
Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf ComputeNumber), WindowsFormsSynchronizationContext.Current)
End Sub
Private Sub ComputeNumber(ByVal uiContext As Object)
Dim randomizer As New Random
Dim x = randomizer.Next(1000, 3000)
Thread.Sleep(x)
DirectCast(uiContext, _
SynchronizationContext).Post(AddressOf AddNumber, x)
End Sub
Private Sub AddNumber(ByVal result As Object)
ListBox1.Items.Add(String.Format("Dokončeno za {0:N0} ms", DirectCast(result, Integer)))
End Sub
End Class