Members

Technology Zones

IBM Learning Center

Articles

Hosted By

MaximumASP

Info

Rated
Read 38,392 times

Contents

Related Categories

UI Threading Helper Classes - The Classes

RoyOsherove

The Classes

using System;
using System.Collections;
using System.Windows.Forms;

namespace Royo.UIThreading
{
      ///
      /// Manages a collection of UIThreadHandlers
      /// And allows easy creation of UIThreadHandler Instances
      ///
      public class UIThreadManager
      {

            //Priate collection of Thread Handlers
            protected ArrayList m_ThreadHandlers = new ArrayList();

            ///
            /// All instances of UIThreadHandlers currently in memory
            ///
            public ArrayList ThreadHandlers
            {
                  get
                  {
                        return m_ThreadHandlers;
                  }
            }


            public UIThreadManager()
            {
            }



            ///
            /// Creates and instance of a UIThreadHandler class
            /// and adds it to the collection of current Handlers
            ///
            /// The target Control on which the new handler will invoke a delegate
            /// The target delegate whcih will be invoked on the Control instance
            /// The created handler
            public  UIThreadHandler CreateHandler(Control TargetControl,EventHandler HandlerDelegateInControl)
            {
                  UIThreadHandler handler = new UIThreadHandler(TargetControl,HandlerDelegateInControl);
                  m_ThreadHandlers.Add(handler);
                  return handler;
                       
            }


            ///
            /// Creates and instance of a UIThreadHandler class
            /// and adds it to the collection of current Handlers
            ///
            /// The target Control on which the new handler will invoke a delegate
            /// The target delegate whcih will be invoked on the Control instance
            /// The created handler
            public UIThreadHandler CreateHandler(Control TargetControl,Delegate HandlerDelegateInControl)
            {
                  UIThreadHandler handler = new UIThreadHandler(TargetControl,HandlerDelegateInControl);
                  m_ThreadHandlers.Add(handler);
                  return handler;
                       
            }


            ///
            /// Creates an instance of a new UIThreadHandler Class
            /// And adds it to the collection of handlers.
            /// Then returns a new delegate of type EventHandler
            /// which points to a method on the new UIThreadHandler.
            ///
            /// The target Control on which the new handler will invoke a delegate
            /// The target delegate whcih will be invoked on the Control instance
            /// An EventHandler Delegate to a method on the UIThread Handler
            public EventHandler NewHandler(Control TargetControl,EventHandler HandlerDelegateInControl)
            {
                        UIThreadHandler handler = CreateHandler(TargetControl,HandlerDelegateInControl);
                        return new EventHandler(handler.BaseEventHandler);
                 
            }


            ///
            /// Removes a UIThreadHandler from the Collection of UIHandlers
            ///
            /// UIThreadHandler Instance to remove
            public void RemoveHandler(UIThreadHandler handler)
            {
                  try
                  {
                        m_ThreadHandlers.Remove(handler);
                  }
                  catch(Exception e){}
                 
            }


            ///
            /// Add a custom handler to the current collection
            ///
            ///
            public void AddHandler(UIThreadHandler handler)
            {
                  try
                  {
                        m_ThreadHandlers.Add(handler);
                  }
                  catch(Exception e){}
                 
            }


      }

      //////////////////////////////////////////////////////////////////
      //////////////////////////////////UIThreadHandler/////////////////
      //////////////////////////////////////////////////////////////////

      ///
      /// This class represents an instance of a UI method caller
      /// Its only job is to recieve a delegate found on
      /// an instance of a control(usually a form) and to invoke that delegate
      /// When it recieved an event
      ///
      public class UIThreadHandler
      {

           
            //The delegate which is called on the UI thread using "m_TargetControl.Invoke()"
            protected System.Delegate m_ControlHandler;

            //The Control (Usualoy A Form) on which to Invoke a UI delegate
            protected Control m_TargetControl;
           
            ///
            /// Creates an instance of UIThreadHandler
            /// Along with its associated Form and Delegate
            /// on which to invoke UI thread-related events
            ///
            /// The Form instance on which UI actions are performed
            /// A delegate pointing to a method on the Form instance
            /// Which updates a control on the Form
            ///
            ///              EventThrower e = new EventThrower();
            ///              e.OnEventThrow+=new EventHandler(m_uimgr.CreateHandler(this,new ///EventHandler(Handler11)).BaseEventHandler);
            ///              e.Start();
            ///
            public UIThreadHandler(Control TargetControl,Delegate HandlerDelegateInControl)
            {
                  m_TargetControl= TargetControl;
                  m_ControlHandler = HandlerDelegateInControl;
            }


            ///
            /// A method which matches most basic event handlers
            /// Use this to create a delegate which recieves events
            /// which need to trigger UI actions in the form thread.
            ///
            ///
            ///
            public void BaseEventHandler(object source, EventArgs args)
            {
                  try
                  {
                        if(m_ControlHandler!=null)
                        {
                              object[] arr = new object[]{source,args};
                              m_TargetControl.Invoke(m_ControlHandler,arr);
                        }
                  }
                  catch(Exception e)
                  {
                        string se =e.ToString();
                        System.Diagnostics.Debug.WriteLine(e.ToString());
                  }
            }


            public void BaseEventHandler(object source, object args)
            {
                  if(m_ControlHandler!=null)
                  {
                        object[] arr = new object[]{source,args};
                        m_TargetControl.Invoke(m_ControlHandler,arr);
                  }
            }

            public void BaseEventHandler()
            {
                  if(m_ControlHandler!=null)
                  {
                        m_TargetControl.Invoke(m_ControlHandler);
                  }
            }


            public void BaseEventHandler(int arg)
            {
                  if(m_ControlHandler!=null)
                  {
                        m_TargetControl.Invoke(m_ControlHandler,new object[]{arg});

                  }
            }


            public void BaseEventHandler(long arg)
            {
                  if(m_ControlHandler!=null)
                  {
                        m_TargetControl.Invoke(m_ControlHandler,new object[]{arg});

                  }
            }

            public void BaseEventHandler(object arg)
            {
                  if(m_ControlHandler!=null)
                  {
                        m_TargetControl.Invoke(m_ControlHandler,new object[]{arg});

                  }
            }

            public void BaseEventHandler(string arg)
            {
                  if(m_ControlHandler!=null)
                  {
                        m_TargetControl.Invoke(m_ControlHandler,new object[]{arg});

                  }
            }



            ///
            /// Explicitly Invoke the Delegate on the Form Instance
            /// using the specifies parameters
            ///
            /// any parameters whcih need to be sent to the
            /// delegate on the Form Instance
            public void Invoke(params object[] args)
            {
                  m_TargetControl.Invoke(m_ControlHandler,args);
            }


      }
}

Roy Osherove has spent the past 6+ years developing data driven applications for various companies in Israel. He's acquired several MCP titles, written a number of articles on various .NET topics, most of which can be found on his weblog, and loves discovering new things everyday. Roy is also the author of the Feedable service and of the free regular expression tool, The Regulator.

Comments

  • suggestion need

    Posted by sureshkumar on 23 Mar 2005

    i am an fresh graduate.i need a suggestion abt how to use threading in dcom application.


    how to reduce the loading time.


    then my final one is, how to run a 2 different threads in DCOM applic...