Click here to Skip to main content
15,897,371 members
Articles / Desktop Programming / Windows Forms

Simple Asynchronous Background Task Processing with Progress Dialog (Silverlight Solution)

Rate me:
Please Sign up or sign in to vote.
4.91/5 (15 votes)
21 Apr 2010CPOL8 min read 49.5K   1.1K   46  
Small, generic, reusable infrastructure for running tasks asynchronously and displaying progress information.
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace AsyncOperation
{
    public class DefaultProgressDlg : ChildWindow
    {
        public event EventHandler Cancelled;

        public DefaultProgressDlg()
        {
            this.HasCloseButton = false;
            
            //default size. inherited dialogs override it in the xaml.
            this.Width = 300;
            this.Height = 200;
        }

        public void EnableCancelButton(bool enabled)
        {
            //check if dialog supports cancel button
            if (CancelButton == null)
                return;

            //set visibility
            if (enabled)
                CancelButton.Visibility = Visibility.Visible;
            else
                CancelButton.Visibility = Visibility.Collapsed;

            //subscribe CancelButton click event
            CancelButton.Click += new RoutedEventHandler(CancelButton_Click);
        }

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            if (Cancelled != null)
                Cancelled(this, EventArgs.Empty);
        }

        protected virtual Button CancelButton
        {
            get { return null; }
        }

        protected void PostMessage(Delegate del, params object[] args)
        {
            //marhsal to ui thread if needed
            if (!this.Dispatcher.CheckAccess())
            {
                this.Dispatcher.BeginInvoke(del, args);
            }
            else
            {
                del.DynamicInvoke(args);
            }
        }

         //individual message handlers
        private void OnCloseWindow()
        {
            base.Close();
        }

        private void OnSetTitle(string text)
        {
            this.Title = text;
        }

        //public typesafe message senders
        public void CloseWindow()
        {
            Action a = new Action(OnCloseWindow);
            PostMessage(a, null);
        }

        public void SetTitle(string text)
        {
            Action<string> a = new Action<string>(OnSetTitle);
            PostMessage(a, text);
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
Ireland Ireland
.NET Developer.

Comments and Discussions