Dubravko's Blog

Dok dišem nadam se…

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% [?]

Posted by dkukec On December - 28 - 2009 Code examples

Leave a Reply



Subscribe here

TAG CLOUD