Geeks With Blogs
New Things I Learned

While playing around with WPF, I tried to do some multithreading where I have a worker thread updating my ObservableCollection, while having a ListCollectionView of that ObservableCollection being shown on a ListBox.

It was surprising to see that I get a NotSupportedException thrown, with the message saying 'This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.'.  That doesn't seem to make sense - In my mind, I understand how the thread that created the UI should be the one that handles all UI updates.  However, the data itself should be able to reside anywhere, and I should be able to update it however and whenever I want.

Looking for a solution, I created a class deriving from ObservableCollection (the class name I chose is ObservableCollectionEx) thinking that I would just manually walk through the event's invocation list.  Well, that didn't quite work, since events are not accessible (other than for adding/removing delegates) to child classes.  Looking at the documentation, the CollectionChanged event in ObservableCollection is virtual - that means I can override it! Yeah!  I am glad someone at Microsoft decided to make that virtual.

So here's the code that I created - the pain is I now have to rename all occurrences of ObservableCollection to this new class.  Oh well, at least making it work with threads isn't too painful. 

public class ObservableCollectionEx<T> : ObservableCollection<T>
{
   // Override the event so this class can access it
   public override event System.Collections.Specialized.NotifyCollectionChangedEventHandler CollectionChanged;

   protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
   {
      // Be nice - use BlockReentrancy like MSDN said
      using (BlockReentrancy())
      {
         System.Collections.Specialized.NotifyCollectionChangedEventHandler eventHandler = CollectionChanged;
         if (eventHandler == null)
            return;
    
         Delegate[] delegates = eventHandler.GetInvocationList();
         // Walk thru invocation list
         foreach (System.Collections.Specialized.NotifyCollectionChangedEventHandler handler in delegates)
         {
            DispatcherObject dispatcherObject = handler.Target as DispatcherObject;
            // If the subscriber is a DispatcherObject and different thread
            if (dispatcherObject != null && dispatcherObject.CheckAccess() == false)
            {
               // Invoke handler in the target dispatcher's thread
               dispatcherObject.Dispatcher.Invoke(DispatcherPriority.DataBind, handler, this, e);
            }
            else // Execute handler as is
               handler(this, e);
         }
      }
   }
}

 Update:

There is a bug with the code where subscribers in the same thread won't get called - the code above has been updated with the fix.

 

It also uses CheckAccess (available, but not shown via Intellisense as mentioned here).

Posted on Wednesday, January 16, 2008 6:30 PM WPF , .NET | Back to top


Comments on this post: Have worker thread update ObservableCollection that is bound to a ListCollectionView

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Nice job! This has been attempted several times by others. In case you are interested, here are some links to others:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2617169&SiteID=1

and here is a link my my solution:
http://blog.quantumbitdesigns.com/2008/01/06/wpf-cross-thread-collection-binding-part-4-the-grand-solution/

Keep up the good work!
Left by Kevin Kerr on Jan 23, 2008 10:30 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
I'm trying the code you posted and I'm getting the following error.

Code:
System.Collections.Specialized.NotifyCollectionChangedEventHandler eventHandler = CollectionChanged;

Compile Error:
The event 'System.Collections.ObjectModel.ObservableCollection<T>.CollectionChanged' can only appear on the left hand side of += or -=

Any ideas?
Left by Jake on May 12, 2008 5:06 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Same issue here... Anything new about it?
Left by SeveQ on Sep 21, 2008 5:39 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
The event has to be overridden first (4th paragraph). You can override it by:
public override NotifyCollectionChangedEventHandler CollectionChanged;
Left by Muljadi Budiman on Sep 22, 2008 8:48 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Should've had the event keyword there:
public override event NotifyCollectionChangedEventHandler CollectionChanged;
Left by Muljadi Budiman on Sep 24, 2008 9:13 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Okay, thank you. I've already found something thet helps me with this problem. It's very similar to your solution.
Left by SeveQ on Sep 24, 2008 10:20 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Good job, been looking around for solution and this works for my problem very well.Most of solution requires the Dispatcher, and I dont want/have access to Dispacther as the collection is deep in the business layer. Getting Dispatcher from the handler is just brilliant!
Left by Sabrina on Dec 16, 2008 12:17 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Well done. Walking the InvocationList is genius.
Left by DeanS on Apr 07, 2009 6:30 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
This solution has an issue, but it's only really apparent with multicore processors and large collections. I got this 5% of the time with a list of 4000.

Wpf code may throw indexoutofranceexceptions when removing items asynchronously. External code may try to access ony of the last items after they were removed from the collection, but before the invoke happens. Raising the priority to 'Send' didn't solve this either. The async code was still sitting in invoke when the exception was thrown.

I'll try to go the hard way and get most of the collection's functions invoke themselves when not on the UI thread.
Left by derm2 on Jun 11, 2009 1:51 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
The comment "I don't want/have access to Dispatcher as the collection is deep in the business layer" is a bit misleading. In WPF, all objects have access to Dispatcher. The trick is to get the one for the main thread - I get a reference to the current Dispatcher in my constructor, which (in my specific example) is always being called on the main thread. I've been very successful doing what derm2 suggests, and invoking as appropriate.
Left by Sven on Aug 12, 2009 4:28 AM

# Comment for derm2
Requesting Gravatar...
Unfortunately external code trying to access some of them items after they're removed is a general problem with multi-threading. A resource that can be accessed by multiple threads need to have locks before it is accessed.

Consider a single list (regular one, not even ObservableCollection) and code that will add an item to the list if the list doesn't contain the item. If the code is then run in parallel on multiple threads (on multi-core CPUs) but the code doesn't lock the list, it will have multiple same items added to the list.

You're correct that Dispatcher adds a level of complexity since the handler execution is not direct (it is added to the Dispatcher Queue); however to depend on the event not firing to assume an item hasn't been removed sounds dangerous too.
Left by Muljadi Budiman on Aug 14, 2009 5:38 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
It is a smart solution. Helped me on time. Thank you very much.
Left by Vijay on Aug 24, 2009 5:31 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Maybe I'm missing someting, but putting this into my code causes a "Does not exist in current context" error on the using(BlockReentrancy()), CollectionChanged and Dispatcher(Object|Priority) lines?
Left by TC on Dec 16, 2009 2:41 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
The code snippet provided is just the method that does the heavy work. However, most people ended up copying and pasting the code without reading the post in depth.

The solution offered assumes that the code will be pasted within a class that derives from ObservableCollection<T>; to alleviate this assumption, I've updated the code to reflect the whole class - along with the code that overrides the event.

Hopefully this makes it clearer to people that read this post.
Left by Muljadi Budiman on Dec 18, 2009 4:25 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
That's a great solution! Thanks!
Left by Nelson Reis on Dec 30, 2009 3:16 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
It would seem that great minds think alike! :D

http://www.codeproject.com/KB/dotnet/MTObservableCollection.aspx
Left by Anthony Paul Ortiz on Mar 12, 2010 1:19 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Thanks a ton! I've been bash'n my head on my desk trying to get my solution to work--now I'm just using yours :)
Left by s. singh on Mar 18, 2010 7:15 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
you are cool and solved my issue :)
Left by aziz on Jun 15, 2010 8:25 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
This solution works great for WPF, but in Silverlight you can't override the CollectionChanged event. Any ideas for how I can get around that in Silverlight?
Left by Stephen on Jun 17, 2010 5:47 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Nice work
Left by Ojas on Jun 23, 2010 8:09 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Awesome - thanks so much!
Left by jefftoaster on Aug 03, 2010 11:19 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Cool - solved my issue perfectly!
Left by Plague on Aug 16, 2010 9:00 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Very nice! Thank you so much.
Left by Gustavo Cavalcanti on Aug 17, 2010 8:02 AM

# frequent use
Requesting Gravatar...
It is indeed a nice solution.
However when i quickly add two items to the list, sometimes it adds two times the second item. I understand the reason but i dont really know how it can be solved. Can someone help me?
Left by Csaba on Aug 31, 2010 7:07 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Great solution for WPF, unfortunately doesn't work for WP7, since you cannot override the CollectionChanged event there. So annoying that they've made these small but IMPORTANT changes to the framework for WP7. Well, have to find another solution :)
Left by Steven on Oct 10, 2010 8:49 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
I had the same problem, but found a different solution which was satisfactory for my problem and wanted to share it:

I created a temporary collection to store the results during processing on the Worker Thread. Once the Worker Thread completed executing, I copied the temporary collection to the ObservableCollection to which was Bound to a ComboBox.
Left by Nick on Jan 02, 2011 7:50 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
I wanted to thank you for this excellent read!! I definitely loved every little bit of it.Cheers for the info!!!! & This is the perfect blog for anyone who wants to know about this topic. You know so much its almost hard to argue with you .........
thanks
Left by 5 in 1 reflectors on Feb 02, 2011 9:09 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
This is probably one of the best mentions of this topic I've seen in quite a while. It's obvious that your knowledge of the subject is deep and this made for a very interesting read.
Left by Genital Warts Treatment on Feb 14, 2011 10:10 PM

# Airsoft Guns
Requesting Gravatar...
Been a reader for some time now, just wanted to say thanks for the great blog and hope you have a wonderful new year to come.
Left by Airsoft on Feb 15, 2011 1:25 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
thanks, it works, you've saved my time
Left by syler on Feb 19, 2011 1:21 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Hi, I found your post really helpful. It helped me all the way in completing my assignment, I am also giving a reference link of your blog in my case study. Thanks for posting such informative content. Keep posting.
Left by foot pain on Mar 02, 2011 9:40 PM

# Works Great Except When ...
Requesting Gravatar...
Hello and thanks for you great implementation...

The only problem im experiencing is that after updating my ObservableCollection from the UI, i cant delete items anymore from a different thread...

Any Ideas Please?

Thanks Alot
Left by OT on Mar 03, 2011 10:59 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
What I dont understand is how you are not even more popular than you are now. You are just so intelligent. You know so much about this subject, made me think about it from so many different angles. Your stuffs great. Keep it up..
Left by buy steroids online on Mar 06, 2011 7:52 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Thank You. It saved saved my time and learned something.
Left by Pinakin Shah on Mar 07, 2011 7:40 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
This blog gives the light in which I can observe the reality. This is very nice one and gives useful information. Thanks for this nice blog.
Left by stretch carpet on Mar 12, 2011 3:59 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
A fantastic presentation. Very open and informative.You have beautifully presented your thought in this blog post
Left by kickspace heaters on Mar 18, 2011 6:39 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
This is a really good post. Must admit that you are amongst the best bloggers I have read. Thanks for posting this informative article.
Left by accredited online degrees on Mar 22, 2011 9:53 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Thank you for a great post. The ObservableCollectionEx is working very well for us. However, we cannot seem to use it Telerik RadGridView. We get the same exception as if we were still use ObservableCollection.
Left by Peter on Mar 29, 2011 7:53 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
works great! thanks
Left by Idan on May 01, 2011 2:33 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Very nice, works like a charm!! Strange that Microsoft havn't added this to the collection
Left by Ramius on Jun 08, 2011 8:06 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Hey thanks for posting this. Even though this post is old. It helped rectify a problem I was having in WPF when subscribing to an IObservable collection from a service. VS2010 would crash without using this method of dispatcher handling.
Left by Mike on Jun 26, 2011 3:42 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
I have to really thank you very much, you've solved me a weird problem !!
Left by Cris on Jun 27, 2011 12:08 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Thanks a lot for that brilliant piece of code !! It helped.
By the way, you forget the 3 constructors override, but it does not really matters, does it.
Great job.
Left by F£ö on Jul 13, 2011 5:26 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Great solution!
Works like a charm for me!
Left by Juri Skuratovski on Jul 14, 2011 2:42 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Thanks. This code helped me
Left by Chris on Dec 08, 2011 4:54 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Thanks. It works!
Left by M on Dec 13, 2011 9:12 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
This is a nice blog regarding the health topic which is the most essential thing for everyone. I have read the whole blog and the information provided here are nice and true which should be keep in our mind.
Left by Windows Hosting India on Dec 20, 2011 5:17 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Thanks mate! This really helped me.
Left by Mattias on Dec 28, 2011 5:26 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Thanks it works. I really appreciate
Left by Luca on Jan 15, 2012 6:42 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Fixed my problem. Wish I understood what you did. Added another contructor for IEnumberabl<T>, don't know why you did not.
Left by Clifford Nelson on Jun 29, 2012 5:14 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Finally something that works for this issue. Have tried several other posts with no success as my situation was rather unique. Thank you!
Left by eBot on Jul 16, 2012 7:13 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Thanks. I have tried some other solutions but this code completely solves my problem. Thanks again.
Left by Engin on Aug 01, 2012 12:50 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Any chance of a VB version: failing miserably to translate the damned event :(.

LOL
Left by RG on Jan 11, 2013 4:22 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
I think I got it :). Had to use a sub lambda.
Public Class ObservableCollectionEx(Of T)
Inherits ObservableCollection(Of T)

' Override the event so this class can access it
Public Shadows Event CollectionChanged As System.Collections.Specialized.NotifyCollectionChangedEventHandler

Protected Overrides Sub OnCollectionChanged(ByVal e As System.Collections.Specialized.NotifyCollectionChangedEventArgs)
' Be nice - use BlockReentrancy like MSDN said
BlockReentrancy()

Dim eventHandler As System.Collections.Specialized.NotifyCollectionChangedEventHandler = Sub() RaiseEvent CollectionChanged(Me, e)
If (eventHandler Is Nothing) Then Return

Dim delegates() As [Delegate] = eventHandler.GetInvocationList
' Walk thru invocation list
For Each handler As System.Collections.Specialized.NotifyCollectionChangedEventHandler In delegates
Dim dispatcherObject As DispatcherObject = CType(handler.Target, DispatcherObject)
' If the subscriber is a DispatcherObject and different thread
If ((Not (dispatcherObject) Is Nothing) _
AndAlso (dispatcherObject.CheckAccess = False)) Then
' Invoke handler in the target dispatcher's thread
dispatcherObject.Dispatcher.Invoke(DispatcherPriority.DataBind, handler, Me, e)
Else
handler(Me, e)
End If
Next
End Sub
End Class
Left by RG on Jan 11, 2013 5:01 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
It doesn't work.. im using threadpool to update the collection and im getting error:

"Added item does not appear at given index"

any body have an idea? i've search google to no avail...
Left by tetris on Feb 24, 2013 2:33 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Found an issue where doing an Add followed by a Remove(0) (to make the collection circular at a give size) can on some machines cause an exception. I don't have the exception text handy, but it comes from the XAML side and it complains about the number of items in the collection being inconsistent, which makes it seem like the UI updates are happening between the Add and Remove(0)
Left by John Woodard on Mar 13, 2013 5:25 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
I have the exception text:

System.InvalidOperationException: An ItemsControl is inconsistent with its items source.
See the inner exception for more information. ---> System.Exception: Information for developers (use Text Visualizer to read this):
This exception was thrown because the generator for control 'System.Windows.Controls.ListBox Items.Count:429' with name '(unnamed)' has received sequence of CollectionChanged events that do not agree with the current state of the Items collection. The following differences were detected:
Accumulated count 428 is different from actual count 429. [Accumulated count is (Count at last Reset + #Adds - #Removes since last Reset).]
At index 1: Generator's item '16:02:54.706, Error, Title: Too far from segment start, Message: dist: 53.586 segstart:(-221.311,806.222) pose:(-166.656,807.233), Sender: Spooler (65), Removed: 16:02:59.681, Notification Cleared ' is different from actual item '16:04:02.557, Error, Title: Off Path, Message: d: 10.8, Sender: Spooler (65), Notification Added'.
At index 2: Generator's item '16:02:54.671, Error, Title: Off Path, Message: d: 10.8, Sender: Spooler (65), Removed: 16:02:59.661, Notification Cleared ' is different from actual item '16:02:54.706, Error, Title: Too far from segment start, Message: dist: 53.586 segstart:(-221.311,806.222) pose:(-166.656,807.233), Sender: Spooler (65), Removed: 16:02:59.681, Notification Cleared '.
At index 3: Generator's item '16:02:43.816, Error, Title: Too far from segment start, Message: dist: 53.586 segstart:(-221.311,806.222) pose:(-166.656,807.233), Sender: Spooler (65), Removed: 16:02:48.751, Notification Cleared ' is different from actual item '16:02:54.671, Error, Title: Off Path, Message: d: 10.8, Sender: Spooler (65), Removed: 16:02:59.661, Notification Cleared '.
(... 86 more instances ...)

One or more of the following sources may have raised the wrong events:
System.Windows.Controls.ItemContainerGenerator
System.Windows.Controls.ItemCollection
System.Windows.Data.ListCollectionView
* Asi.Ui.Wpf.CrossThreadObservableCollection`1[[Asi.Notifications.Notification, Asi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
(The starred sources are considered more likely to be the cause of the problem.)

The most common causes are (a) changing the collection or its Count without raising a corresponding event, and (b) raising an event with an incorrect index or item parameter.

Left by Brannon on May 07, 2013 10:16 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
@Brannon, Im getting that exact issue "An ItemsControl is inconsistent with its items source." but this only happens after i installed vs2012 it was already working correctly using vs 2008 anyone found the solution?
Left by tetres on Jun 12, 2013 3:03 AM

# An ItemsControl is inconsistent with its itemssource.
Requesting Gravatar...
@Brannon @tetres

i am getting the same issue. Has anyone been able to resolve this?
Left by bajwa on Dec 24, 2013 10:13 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
i think i've zeroed into the problem (atleast when i repeat this, the problem surfaces, hence it is now in predictable domain).

The problem arises while the collection (which is binded to a listbox) is being updated from a background thread and the view is refreshed (window is maximized, dimensions change).

This causes an exception while redrawing because while the redraw function (in the UI Thread) is measuring the screen real estate required by the children, the child count changes (because it is also being updated in a background thread). This causes the exception ("An ItemsControl is inconsistent with its items source.") to be raised. i was able to come up with this theory by looking at the stack trace.

Now, the big question: how can i prevent this? Locks?
Left by bajwa on Dec 24, 2013 10:30 PM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Thanks a ton for sharing. You made my day!!
Left by Anitha on Jan 21, 2014 5:06 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
Thanks a ton for sharing. You made my day!!
Left by Anitha on Jan 21, 2014 5:06 AM

# re: Have worker thread update ObservableCollection that is bound to a ListCollectionView
Requesting Gravatar...
To bajwa and others.
There is workaround the problem.
Bind ItemsSource to ICollectionView with sorting or filtering enabled.

It works:
view.Filter = o => true;
view.SortDescriptions.Add(new SortDescription());
Left by Zberbang on Jun 05, 2014 12:22 AM

Your comment:
 (will show your gravatar)


Copyright © Muljadi Budiman | Powered by: GeeksWithBlogs.net | Join free