From a31d7ff3bf4c11d2c6dd69c7adbd09a2fed42876 Mon Sep 17 00:00:00 2001 From: krystalgamer Date: Wed, 26 Nov 2025 00:00:23 +0100 Subject: [PATCH] fix: don't hold reference to factory to prevent memory leak --- src/Nito.AsyncEx.Coordination/AsyncLazy.cs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Nito.AsyncEx.Coordination/AsyncLazy.cs b/src/Nito.AsyncEx.Coordination/AsyncLazy.cs index db9811b..4f93df0 100644 --- a/src/Nito.AsyncEx.Coordination/AsyncLazy.cs +++ b/src/Nito.AsyncEx.Coordination/AsyncLazy.cs @@ -40,11 +40,6 @@ public sealed class AsyncLazy /// private readonly object _mutex; - /// - /// The factory method to call. - /// - private readonly Func> _factory; - /// /// The underlying lazy task. /// @@ -77,14 +72,15 @@ public AsyncLazy(Func> factory, AsyncLazyFlags flags = AsyncLazyFlags.No { if (factory == null) throw new ArgumentNullException(nameof(factory)); - _factory = factory; + + var innerFactory = factory; if ((flags & AsyncLazyFlags.RetryOnFailure) == AsyncLazyFlags.RetryOnFailure) - _factory = RetryOnFailure(_factory); + innerFactory = RetryOnFailure(innerFactory); if ((flags & AsyncLazyFlags.ExecuteOnCallingThread) != AsyncLazyFlags.ExecuteOnCallingThread) - _factory = RunOnThreadPool(_factory); + innerFactory = RunOnThreadPool(innerFactory); _mutex = new object(); - _instance = new Lazy>(_factory); + _instance = new Lazy>(innerFactory); } /// @@ -131,7 +127,7 @@ private Func> RetryOnFailure(Func> factory) { lock (_mutex) { - _instance = new Lazy>(_factory); + _instance = new Lazy>(factory); } throw; }