Click here to Skip to main content
15,885,956 members
Articles / Desktop Programming / WPF
Tip/Trick

The calling thread cannot access this object because a different thread owns it

Rate me:
Please Sign up or sign in to vote.
0.00/5 (No votes)
13 Nov 2010CPOL 19K   2   1
Calling thread cannot access this object because a different thread owns it
Today I faced an issue with my custom control which has my own DictionaryList with custom CustomKeyValuePair class as Value of dictionary list. Key is a string type, so no problem on it. I used this dictionary list for storing resources to provide different skin support in my control template. Note the point, my CustomKeyValuePair class inherited from DependencyObject. After implementing my control with effective skin mechanism, I tried to host my control in multi threaded WPF application. But unfortunately, I got this error message {"The calling thread cannot access this object because a different thread owns it."} since calling thread uses my dictionary list Value(CustomKeyValuePair). As I said, this class inherited from DependencyObject, so WPF won't allow you to access dependency property in multi thread application.

Initially I tried to solve this issue with value cloning logic. But no use. Finally, I tried with INotifyPropertyChanged class. Yes, I just removed base class DependencyObject from CustomKeyValuePair class and implemented INotifyPropertyChanged interface with Value property notification when its value getting changed. Now my controls work in multithread WPF application perfectly. :)

C#
public class CustomKeyValuePair : INotifyPropertyChanged //DependencyObject
{
//public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(object), typeof(PairKeyValue), new UIPropertyMetadata(null));

//public object Value
//{
// get
// {
// return (object)GetValue(ValueProperty);
// }
// set
// {
// SetValue(ValueProperty, value);
// }
//}

// Solution for "The calling thread cannot access this object because a different thread owns it."

object _value;

/// <summary>
/// Gets or sets the value in key-value pair.
/// </summary>
public object Value
{
get
{
return _value;
}
set
{
_value=value;
OnPropertyChanged("Value");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}


Enjoy :)

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) Logitech Engineering & Design (India) Pvt. Ltd.
India India
Venugopal works as a Senior Software Engineer in Logitech Engineering & Design (India) Pvt. Ltd. He hold a Masters in Computer Applications and has 4+ years experience in C#, XAML, Silverlight & WPF.

Venugopal firmly believes "technology is impermanent, change is not"!. While he has strong technical inclination towards MS technologies, he is deeply passionate about pursuing his career in Windows7-WPF and Silverlight Technology.

Venu engages in a wide gamut of temperamental hobbies ranging from making friends, traveling, helping his friends studies. To murmuring songs and watching movies in leisure time.

Comments and Discussions

 
QuestionAnimations. Pin
hannes.ambichler14-Sep-12 19:01
hannes.ambichler14-Sep-12 19:01 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.