Click here to Skip to main content
15,885,278 members
Articles / Programming Languages / C#

Thread-safe Silverlight Cairngorm

Rate me:
Please Sign up or sign in to vote.
4.75/5 (9 votes)
20 Oct 2008CDDL6 min read 49.3K   320   21  
Some code changes and improvements that make the Silverlight Cairngorm thread-safe
using System;
using System.Windows;
using System.ComponentModel;
using System.Windows.Threading;

namespace SilverlightCairngorm.Model
{
	/// <summary>
	/// Custom ModelLocator will derive from this abstract class.
	/// 
	/// Custom ModelLocator usually implements Singleton pattern,
	/// please see the example of CairgormEventDispatcher to make the Singleton thread-safe
	/// </summary>
	public abstract class ModelLocator : INotifyPropertyChanged
	{
		//the dispatcher to ensure the PropertyChange event will raised for UI thread to update bound data
		private Dispatcher currentDispatcher;

		protected ModelLocator()
		{
			if (Application.Current != null &&
				Application.Current.RootVisual != null &&  
				Application.Current.RootVisual.Dispatcher != null) 
			{            
				currentDispatcher = Application.Current.RootVisual.Dispatcher;
			}
			else // can't get the Dispatcher, throw an exception 
			{            
				throw new InvalidOperationException("ModelLocator must be initialized after that the RootVisual has been loaded");
			}
		}
		
		#region INotifyPropertyChanged Members

		public event PropertyChangedEventHandler PropertyChanged = delegate { };
		protected void NotifyPropertyChanged(string propertyName)
		{
			//check if we are on the Dispatcher thread if not switch
			if (currentDispatcher.CheckAccess())
				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
			else
				currentDispatcher.BeginInvoke(new Action<string>(NotifyPropertyChanged), propertyName);
		}

		#endregion

	}
}

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 Common Development and Distribution License (CDDL)


Written By
Technical Lead
United States United States
https://github.com/modesty

https://www.linkedin.com/in/modesty-zhang-9a43771

https://twitter.com/modestyqz

Comments and Discussions