Use BackgroundWorker to run task at background
<UserControl x:Class='SilverlightApplication3.MainPage' xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns:d='http://schemas.microsoft.com/expression/blend/2008' xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006' mc:Ignorable='d' d:DesignWidth='640' d:DesignHeight='480'> <StackPanel> <ProgressBar Name="progressBar" Margin="4"/> <Button Name="button" Click="button_Click">Start</Button> </StackPanel> </UserControl> //File:Window.xaml.cs using System.ComponentModel; using System.Threading; using System.Windows; using System.Windows.Input; using System; using System.Windows.Controls; namespace SilverlightApplication3 { public partial class MainPage : UserControl { private BackgroundWorker worker = new BackgroundWorker(); public MainPage() { InitializeComponent(); worker.WorkerReportsProgress = true; worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); worker.ProgressChanged += worker_ProgressChanged; } private void button_Click(object sender, RoutedEventArgs e) { worker.RunWorkerAsync(); this.Cursor = Cursors.Wait; button.IsEnabled = false; } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.Cursor = Cursors.Arrow; if(e.Error != null) Console.WriteLine(e.Error.Message); button.IsEnabled = true; } private void worker_DoWork(object sender, DoWorkEventArgs e) { for(int i = 1; i <= 100; i++) { Thread.Sleep(100); worker.ReportProgress(i); } } private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; } } }
1. | Use Background Worker |