Click here to Skip to main content
13,299,298 members (44,860 online)
Click here to Skip to main content


62 bookmarked
Posted 27 Sep 2006

Generic InvocationHelper

, 8 Jun 2007
A generic class for providing thread-safe invocation of delegates. Can be used for (but not limited to) updating GUI elements from another thread.
 * InvocationHelper
 *	A generic class for providing thread-safe invocation of
 *	delegates.  Can be used for (but not limited to) updating GUI
 *	elements from another thread.
 * Edward Poore -
 * Disclaimer
 *	This code has been run so it does work.  However, it has not been
 *	thoroughly tested so use at your own risk.
 *	This code requires Generics, and therefore .NET 2.  I have no
 *	patience for any one who will try and run this on .NET 1.x.
 *  If you do try to do so then might I suggest you find another
 *	job/profession!
 * License
 *	Feel free to modify and use it where you want, commerical or
 *	otherwise.  However I would (like all others) like to be
 *	acknowledged somewhere.
 *	I'd also be curious to hear of any wierd and wacky places the
 *	code is used.  It'd be interesting to hear about even if it's
 *	not wierd and wacky :-).

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;

namespace SpitfireSystems
	public static class InvocationHelper<T>
		public static void Invoke(T eventHandler)
			InvocationHelper<T>.Invoke(eventHandler, null);
		public static void Invoke(T eventHandler, params object[] arguments)
			// Check that T is a delegate type
			if (!(eventHandler is Delegate))
				throw new ArgumentException(string.Format("Type {0} is not derived from {1}", eventHandler.GetType().Name, typeof(Delegate).Name));
			// Cast the to a delegate now since it's needed later
			Delegate handler = (eventHandler as Delegate);
			int requiredParameters = handler.Method.GetParameters().Length;
			// Check that the correct number of arguments have been supplied
			if (requiredParameters != arguments.Length)
				throw new ArgumentException(string.Format("{0} arguments provided when {1} {2} required.", arguments.Length, requiredParameters, ((requiredParameters == 1) ? "is" : "are")));
			// Get a local copy of the invocation list in case it changes
			Delegate[] invocationList = handler.GetInvocationList();
			// Check that it's not null
			if (invocationList == null)
			// Loop through delegates and check for ISynchronizeInvoke
			foreach (Delegate singleCastDelegate in invocationList)
				ISynchronizeInvoke synchronizeTarget = singleCastDelegate.Target as ISynchronizeInvoke;
				// Check to see if the interface was supported
				if (synchronizeTarget == null)
					// Invoke delegate normally
					// Invoke through synchronization interface
					synchronizeTarget.BeginInvoke(singleCastDelegate, arguments);

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.


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


About the Author

Engineer PooreDesign
United Kingdom United Kingdom
Ed is a student who due to a form of cancer (now clear) took a year out before going to Imperial College, London to study Electronic Engineering.

His interests include shooting (clay-pigeon (shotgun), air-rifle and rifle), playing with his three labradors (Sandy, Rosie and Tundra), programming (most experienced in C# and C, although those are not the only ones), walking (has completed Gold Duke of Edinburgh's Award), playing games and reading.

He lives in two places on a 57 acre farm in West Waleswith the rest of the family during the holidays; and Greater London during term time.

Languages and Technologies: C#, C, VB6, VB.NET, XAML, (X)HTML, CSS, XSLT, Assembler (PIC), ASP.NET, WPF, Windows.Forms, ASP, VBScript, JavaScript, Pascal / Delphi, XML

Current Stuff:
1st Year MEng Electronics Engineering (Imperial College, London)

You may also be interested in...

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.171207.1 | Last Updated 8 Jun 2007
Article Copyright 2006 by Ed.Poore
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid