Saturday, 19 July 2014



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BackgroundThreading
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {

            //NOTE: we shouldn't use a try catch block here (unless you rethrow the exception) 
            //the backgroundworker will be able to detect any exception on this code. 
            //if any exception is produced, it will be available to you on  
            //the RunWorkerCompletedEventArgs object, method backgroundWorker1_RunWorkerCompleted 
            //try 
            //{ 
            DateTime start = DateTime.Now;
            e.Result = "";
            for (int i = 1; i <= 100; i++)
            {
                System.Threading.Thread.Sleep(50); //do some intense task here. 
                backgroundWorker1.ReportProgress(i, DateTime.Now);
                //notify progress to main thread. We also pass time information in UserState to cover this property in the example. 
                //Error handling: uncomment this code if you want to test how an exception is handled by the background worker. 
                //also uncomment the mentioned attribute above to it doesn't stop in the debugger. 
                //if (i == 34)
                //    throw new Exception("something wrong here!!"); 

                //if cancellation is pending, cancel work. 
                if (backgroundWorker1.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
            }

            TimeSpan duration = DateTime.Now - start;

            //we could return some useful information here, like calculation output, number of items affected, etc.. to the main thread. 
            e.Result = "Duration: " + duration.TotalMilliseconds.ToString() + " ms.";
            //} 
            //catch(Exception ex){ 
            //    MessageBox.Show("Don't use try catch here, let the backgroundworker handle it for you!"); 
            //} 
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage; //update progress bar 
            lblMessage.Text = e.ProgressPercentage + "% completed...";
            DateTime time = Convert.ToDateTime(e.UserState); //get additional information about progress 
           
            //in this example, we log that optional additional info to textbox 
            textBox1.AppendText(time.ToLongTimeString());
            textBox1.AppendText(Environment.NewLine);     
           
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                MessageBox.Show("The task has been cancelled ");
            }
            else if (e.Error != null)
            {
                MessageBox.Show("Error. Details: " + (e.Error as Exception).ToString());
            }
            else
            {
                MessageBox.Show("The task has been completed. Results: " + e.Result.ToString());
            } 
           
        }
    }
}


Categories: