Create a Background Worker Thread in XAML
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=System"
Title="WPF" Height="100" Width="200">
<Window.Resources>
<ComponentModel:BackgroundWorker
x:Key="backgroundWorker"
WorkerReportsProgress="True"
WorkerSupportsCancellation="True"
DoWork="BackgroundWorker_DoWork"
RunWorkerCompleted="BackgroundWorker_RunWorkerCompleted"
ProgressChanged="BackgroundWorker_ProgressChanged"/>
</Window.Resources>
<StackPanel>
<ProgressBar Name="progressBar"/>
<Button Name="button" Click="button_Click" HorizontalAlignment="Center">Start</Button>
</StackPanel>
</Window>
//File:Window.xaml.vb
Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.Windows
Imports System.Windows.Input
Namespace WpfApplication1
Public Partial Class Window1
Inherits Window
Private ReadOnly worker As BackgroundWorker
Public Sub New()
InitializeComponent()
worker = TryCast(Me.FindResource("backgroundWorker"), BackgroundWorker)
End Sub
Private Sub button_Click(sender As Object, e As RoutedEventArgs)
If Not worker.IsBusy Then
Me.Cursor = Cursors.Wait
worker.RunWorkerAsync()
button.Content = "Cancel"
Else
worker.CancelAsync()
End If
End Sub
Private Sub BackgroundWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
For i As Integer = 1 To 100
If worker.CancellationPending Then
Exit For
End If
Thread.Sleep(100)
worker.ReportProgress(i)
Next
End Sub
Private Sub BackgroundWorker_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs)
Me.Cursor = Cursors.Arrow
Console.WriteLine(e.[Error].Message)
button.Content = "Start"
End Sub
Private Sub BackgroundWorker_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs)
progressBar.Value = e.ProgressPercentage
End Sub
End Class
End Namespace
Related examples in the same category