kopia lustrzana https://github.com/dl2alf/AirScout
63 wiersze
2.0 KiB
C#
63 wiersze
2.0 KiB
C#
using System;
|
|
|
|
namespace GMap.NET.ObjectModel
|
|
{
|
|
public class ObservableCollectionThreadSafe<T> : ObservableCollection<T>
|
|
{
|
|
NotifyCollectionChangedEventHandler collectionChanged;
|
|
public override event NotifyCollectionChangedEventHandler CollectionChanged
|
|
{
|
|
add
|
|
{
|
|
collectionChanged += value;
|
|
}
|
|
remove
|
|
{
|
|
collectionChanged -= value;
|
|
}
|
|
}
|
|
|
|
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
|
|
{
|
|
// Be nice - use BlockReentrancy like MSDN said
|
|
using(BlockReentrancy())
|
|
{
|
|
if(collectionChanged != null)
|
|
{
|
|
Delegate[] delegates = collectionChanged.GetInvocationList();
|
|
|
|
// Walk thru invocation list
|
|
foreach(NotifyCollectionChangedEventHandler handler in delegates)
|
|
{
|
|
#if !PocketPC
|
|
System.Windows.Forms.Control dispatcherObject = handler.Target as System.Windows.Forms.Control;
|
|
|
|
// If the subscriber is a DispatcherObject and different thread
|
|
if(dispatcherObject != null && dispatcherObject.InvokeRequired)
|
|
{
|
|
// Invoke handler in the target dispatcher's thread
|
|
dispatcherObject.Invoke(handler, this, e);
|
|
}
|
|
else // Execute handler as is
|
|
{
|
|
collectionChanged(this, e);
|
|
}
|
|
#else
|
|
// If the subscriber is a DispatcherObject and different thread
|
|
if(handler != null)
|
|
{
|
|
// Invoke handler in the target dispatcher's thread
|
|
handler.Invoke(handler, e);
|
|
}
|
|
else // Execute handler as is
|
|
{
|
|
collectionChanged(this, e);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|