#if FAT using System; using System.Threading; namespace LinqInternal.Threading.Needles { [Serializable] [System.Diagnostics.DebuggerNonUserCode] internal class FutureDisposableNeedle : LazyDisposableNeedle where T : IDisposable { private int _status; public FutureDisposableNeedle(Func valueFactory) : base(valueFactory) { Schedule(); } public FutureDisposableNeedle(Func valueFactory, bool schedule) : base(valueFactory) { if (schedule) { Schedule(); } } public override void Initialize() { if (Volatile.Read(ref _status) == 1) { base.Wait(); } else { base.Initialize(); } } public bool Schedule() { if (Interlocked.CompareExchange(ref _status, 1, 0) != 0) { return false; } var waitCallback = new WaitCallback(_ => Initialize()); ThreadPool.QueueUserWorkItem(waitCallback); return true; } public override void Wait() { Initialize(); } } } #endif