Je tu několik problémů, které vycházejí z architektury, ale nejsou neřešitelné. A není nikterak složité. Musíte si uvědomit následující fakta: 1. V aplikace bude existovat více vláken. Vždy máme jedno hlavní vlákno a jeho zdržení znamená zaseknutí aplikace. 2. Kód, který trvá dlouho je potřeba přesunout do jiného než hlavního vlákna. 3. Kód, který komunikuje s uživatelským prostředím (změna obrázku, změna textu v labelu atp.) je potřeba vykonat v hlavním vlákně. Použití vedlejšího vlákna bude znamenat pád vlákna. Postup:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
Button1.IsEnabled = False
Label1.Content = "Prosím čekejte..."
' uživatel vyvolal asynchronní operaci například klepnutím na tlačítko
' použijeme ThreadPool pro vyvolání operace v druhém vlákně
System.Threading.ThreadPool.QueueUserWorkItem(AddressOf OperationWork)
End Sub
Sub OperationWork(ByVal parameter As Object)
' simulovat - dlouhá operace
System.Threading.Thread.Sleep(2000)
' pomocí objektu Dispatcher vyvolat výsledek v hlavním vlákně
Dispatcher.BeginInvoke(New Action(AddressOf OperationCompletedMainThread))
End Sub
Sub OperationCompletedMainThread()
' tato operace se provede v hlavním vlákně po dokončení dlouhé operace ve vedlejším vlákně
Button1.IsEnabled = True
Label1.Content = "Hotovo"
End Sub
|