private void Finish() { ThreadingHelper.SpinWaitWhile(ref _status, _changing); if (Interlocked.CompareExchange(ref _status, _executing, _created) == _created) { var callback = Volatile.Read(ref Callback); if (callback != null) { callback.Invoke(); Close(); Volatile.Write(ref _status, _executed); } } }
private void Initialize(long dueTime) { if (Thread.VolatileRead(ref _executed) == 1) { ThreadingHelper.SpinWaitWhile(ref _completed, 1); Thread.VolatileWrite(ref _executed, 0); } _start = ThreadingHelper.Milliseconds(ThreadingHelper.TicksNow()); _targetTime = _start + dueTime; if (_wrapped == null) { _wrapped = new Timer(Callback, null, dueTime, System.Threading.Timeout.Infinite); } else { _wrapped.Change(dueTime, System.Threading.Timeout.Infinite); } }
private void Finish() { ThreadingHelper.SpinWaitWhile(ref _status, _changing); if (Interlocked.CompareExchange(ref _status, _executing, _started) != _started) { return; } var callback = Volatile.Read(ref _callback); if (callback == null) { return; } callback.Invoke(); Volatile.Write(ref _status, _executed); Close(); }