From 5eff62bb5ae40cdba992bc6355d8facbfb52ba83 Mon Sep 17 00:00:00 2001 From: neuecc Date: Wed, 8 Sep 2021 19:20:32 +0900 Subject: [PATCH] SynchronizedEnumerator is dead --- sandbox/WpfApp/MainWindow.xaml.cs | 2 +- .../Internal/SynchronizedEnumerator.cs | 46 ------------------- .../ObservableDictionary.cs | 8 +++- .../ObservableFixedSizeRingBuffer.cs | 8 +++- src/ObservableCollections/ObservableList.cs | 8 +++- src/ObservableCollections/ObservableQueue.cs | 8 +++- .../ObservableRingBuffer.cs | 8 +++- 7 files changed, 36 insertions(+), 52 deletions(-) delete mode 100644 src/ObservableCollections/Internal/SynchronizedEnumerator.cs diff --git a/sandbox/WpfApp/MainWindow.xaml.cs b/sandbox/WpfApp/MainWindow.xaml.cs index 00a66df..afd9981 100644 --- a/sandbox/WpfApp/MainWindow.xaml.cs +++ b/sandbox/WpfApp/MainWindow.xaml.cs @@ -30,7 +30,7 @@ namespace WpfApp InitializeComponent(); this.DataContext = this; - + list = new ObservableList(); diff --git a/src/ObservableCollections/Internal/SynchronizedEnumerator.cs b/src/ObservableCollections/Internal/SynchronizedEnumerator.cs deleted file mode 100644 index 0f177df..0000000 --- a/src/ObservableCollections/Internal/SynchronizedEnumerator.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.Threading; - -namespace ObservableCollections.Internal -{ - internal class SynchronizedEnumerator : IEnumerator - { - bool isDisposed; - readonly object gate; - readonly bool lockTaken; - readonly IEnumerator enumerator; - - public SynchronizedEnumerator(object gate, IEnumerator enumerator) - { - this.gate = gate; - this.enumerator = enumerator; - Monitor.Enter(gate, ref lockTaken); - } - - public T Current => enumerator.Current; - - object IEnumerator.Current => Current!; - public bool MoveNext() => enumerator.MoveNext(); - public void Reset() => enumerator.Reset(); - - public void Dispose() - { - if (!isDisposed) - { - isDisposed = true; - try - { - enumerator.Dispose(); - } - finally - { - if (lockTaken) - { - Monitor.Exit(gate); - } - } - } - } - } -} diff --git a/src/ObservableCollections/ObservableDictionary.cs b/src/ObservableCollections/ObservableDictionary.cs index 964d731..4f213b2 100644 --- a/src/ObservableCollections/ObservableDictionary.cs +++ b/src/ObservableCollections/ObservableDictionary.cs @@ -211,7 +211,13 @@ namespace ObservableCollections public IEnumerator> GetEnumerator() { - return new SynchronizedEnumerator>(SyncRoot, dictionary.GetEnumerator()); + lock (SyncRoot) + { + foreach (var item in dictionary) + { + yield return item; + } + } } IEnumerator IEnumerable.GetEnumerator() diff --git a/src/ObservableCollections/ObservableFixedSizeRingBuffer.cs b/src/ObservableCollections/ObservableFixedSizeRingBuffer.cs index d67a11c..80780d9 100644 --- a/src/ObservableCollections/ObservableFixedSizeRingBuffer.cs +++ b/src/ObservableCollections/ObservableFixedSizeRingBuffer.cs @@ -280,7 +280,13 @@ namespace ObservableCollections public IEnumerator GetEnumerator() { - return new SynchronizedEnumerator(SyncRoot, buffer.GetEnumerator()); + lock (SyncRoot) + { + foreach (var item in buffer) + { + yield return item; + } + } } IEnumerator IEnumerable.GetEnumerator() diff --git a/src/ObservableCollections/ObservableList.cs b/src/ObservableCollections/ObservableList.cs index f611db3..b14a64b 100644 --- a/src/ObservableCollections/ObservableList.cs +++ b/src/ObservableCollections/ObservableList.cs @@ -139,7 +139,13 @@ namespace ObservableCollections public IEnumerator GetEnumerator() { - return new SynchronizedEnumerator(SyncRoot, list.GetEnumerator()); + lock (SyncRoot) + { + foreach (var item in list) + { + yield return item; + } + } } IEnumerator IEnumerable.GetEnumerator() diff --git a/src/ObservableCollections/ObservableQueue.cs b/src/ObservableCollections/ObservableQueue.cs index 7de4d5f..2a66ca6 100644 --- a/src/ObservableCollections/ObservableQueue.cs +++ b/src/ObservableCollections/ObservableQueue.cs @@ -203,7 +203,13 @@ namespace ObservableCollections public IEnumerator GetEnumerator() { - return new SynchronizedEnumerator(SyncRoot, queue.GetEnumerator()); + lock (SyncRoot) + { + foreach (var item in queue) + { + yield return item; + } + } } IEnumerator IEnumerable.GetEnumerator() diff --git a/src/ObservableCollections/ObservableRingBuffer.cs b/src/ObservableCollections/ObservableRingBuffer.cs index 0f653e3..fe4c8a4 100644 --- a/src/ObservableCollections/ObservableRingBuffer.cs +++ b/src/ObservableCollections/ObservableRingBuffer.cs @@ -195,7 +195,13 @@ namespace ObservableCollections public IEnumerator GetEnumerator() { - return new SynchronizedEnumerator(SyncRoot, buffer.GetEnumerator()); + lock (SyncRoot) + { + foreach (var item in buffer) + { + yield return item; + } + } } IEnumerator IEnumerable.GetEnumerator()