Ako u aplikaciji koristimo metode koje se dugo izvršavaju, dobra praksa je te metode pokrenuti u novoj dretvi (Thread). Slijedi primjer kako to napraviti. Potrebna nam se XAML stranica sa dvije labele, progressbar-om, te dva gumba, a code behind te stranice je slijedeći:
public partial class BGWorker : Page
{
BackgroundWorker aWorker = new BackgroundWorker();
public BGWorker()
{
InitializeComponent();
//omogućimo Cancel i "progres" funkcionalnost
aWorker.WorkerSupportsCancellation = true;
aWorker.WorkerReportsProgress = true;
//pretplatimo se na evente
aWorker.DoWork += new DoWorkEventHandler(aWorker_DoWork);
aWorker.ProgressChanged += new ProgressChangedEventHandler(aWorker_ProgressChanged);
aWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(aWorker_RunWorkerCompleted);
}
#region BackgroundWorker Events
void aWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 10; i++)
{
MyLongMethod();
aWorker.ReportProgress(i * 10);
if (aWorker.CancellationPending)
{
e.Cancel = true;
return;
}
UpdateLabelDelegate update = new UpdateLabelDelegate(UpdateLabel);
label1.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, update, i);
}
}
void aWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//potrebno je koristiti Dispatcher kako bi se iz thread-a sigurno izvršio kod na objektima UI-a, iz tog razloga koriste se delegati
UpdateProgressDelegate update = new UpdateProgressDelegate(UpdateProgress);
progressBar1.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, update, e.ProgressPercentage);
}
void aWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!(e.Cancelled))
label2.Content = "Run Completed!";
else
label2.Content = "Run Cancelled!";
}
#endregion
#region Metoda koja se dugo izvršava
private void MyLongMethod()
{
Thread.Sleep(1000);
}
#endregion
#region delegates
private delegate void UpdateLabelDelegate(int i);
private void UpdateLabel(int i)
{
label1.Content = "Cycle: " + i.ToString();
}
private delegate void UpdateProgressDelegate(int i);
private void UpdateProgress(int i)
{
progressBar1.Value = i;
}
#endregion
#region klikovi na gumbe
private void button1_Click(object sender, RoutedEventArgs e)
{
aWorker.RunWorkerAsync();
}
private void button2_Click(object sender, RoutedEventArgs e)
{
aWorker.CancelAsync();
}
#endregion
}
Naravno, potrebno je dodati i slijedeće:
using System.ComponentModel; using System.Threading;
Popularity: 6% [?]