在C#中处置延迟初始化的对象的线程安全方法是什么?假设我具有以下Lazy
构造:
Lazy<MyClass> lazy = new Lazy<MyClass>(() => MyClass.Create(), true);
稍后,我可能想处置创建的MyClass
实例。现有的大多数解决方案都建议采用以下方式:
if (lazy.IsValueCreated)
{
lazy.Value.Dispose();
}
但是据我所知IsValueCreated
没有任何锁:https://referencesource.microsoft.com/#mscorlib/system/Lazy.cs,284
这意味着当我们检查MyClass
时,另一个线程可能正在初始化IsValueCreated
。在这种情况下,我们将观察到IsValueCreated
为假,最终导致资源泄漏。正确的做法是什么?还是我错过了一些细微的细节?