Browse Source

Do not call dispose within lock-statement.

Daniel Weber 11 years ago
parent
commit
207ef13f38
1 changed files with 14 additions and 10 deletions
  1. 14 10
      Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Single.cs

+ 14 - 10
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Single.cs

@@ -252,14 +252,16 @@ namespace System.Linq
 
                 var disposeIe = new Action(() =>
                 {
+                    IAsyncEnumerator<TResult> localIe;
+
                     lock (syncRoot)
                     {
-                        if (ie != null)
-                        {
-                            ie.Dispose();
-                            ie = null;
-                        }
+                        localIe = ie;
+                        ie = null;
                     }
+
+                    if (localIe != null)
+                        localIe.Dispose();
                 });
 
                 var cts = new CancellationTokenDisposable();
@@ -344,14 +346,16 @@ namespace System.Linq
 
                 var disposeIe = new Action(() =>
                 {
+                    IAsyncEnumerator<TResult> localIe;
+
                     lock (syncRoot)
                     {
-                        if (ie != null)
-                        {
-                            ie.Dispose();
-                            ie = null;
-                        }
+                        localIe = ie;
+                        ie = null;
                     }
+
+                    if (localIe != null)
+                        localIe.Dispose();
                 });
 
                 var index = 0;