Alex Rivera | Logout

Threading errors with Application.LoadComponent (key already exists)

Asked 2010-03-17T16:03:03.183
22

MSDN says that public static members of System.Windows.Application are thread safe. But when I try to run my app with multiple threads I get the following exception:

ArgumentException: An entry with the same key already exists.

   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.SortedList`2.Add(TKey key, TValue value)
   at System.IO.Packaging.Package.AddIfNoPrefixCollisionDetected(ValidatedPartUri partUri,
        PackagePart part)
   at System.IO.Packaging.Package.GetPartHelper(Uri partUri)
   at System.IO.Packaging.Package.GetPart(Uri partUri)
   at System.Windows.Application.GetResourceOrContentPart(Uri uri)
   at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean 
bSkipJournaledProperties)
       at System.Windows.Application.LoadComponent(Uri resourceLocator)

The exception occurs on the following call:

genericResources = (ResourceDictionary)Application.LoadComponent(new Uri("/Themes/Generic.xaml", UriKind.Relative));

The application works fine on a single thread and even on two or three. When I get up past 5 then I get the error every time. Am I doing something wrong? What can I do to fix this?

Edit
Report

1 Answer

0

It looks like an item with the same key has already been added in the map. It's not a threading issue, it's an issue with the program you have. One thread has added a key/value pair to the map and a second thread is attempting to add a value with an identical key, how did you end up having identical keys on two separate threads? How are you generating the keys?

The elements of a SortedList object are sorted by the keys either according to a specific IComparer implementation specified when the SortedList is created or according to the IComparable implementation provided by the keys themselves. In either case, a SortedList does not allow duplicate keys.

(from the msdn documentation)

Update:
Try synchronizing when you're calling LoadComponent and see if the issue still persists.

I simply don't know what they mean when they say the following:

The public static (Shared in Visual Basic) members of this type are thread safe. In addition, the FindResource and TryFindResource methods and the Properties and Resources properties are thread safe.

It sure does say thread safe, but if it's duplicating identical keys, then they must be referring to some other type of thread safety.

answered 2010-03-17T16:09:15.093

Your Answer