using System; using System.Collections.Generic; namespace BITKit { /// /// 双缓冲区 /// /// public interface IDoubleBuffer { bool CanRelease { get; } T Current { get; } void Release(T newValue); event Action OnRelease; bool TryGetRelease(out T result); } /// /// /// /// public class DoubleBuffer : IDoubleBuffer { public bool CanRelease => _release.Allow; public T Current { get; // ReSharper disable once MemberCanBePrivate.Global protected set; } public void Release(T newValue) { Current = newValue; OnRelease?.Invoke(newValue); _release.SetValueThenAllow(newValue); } public void Clear() { _release.Clear(); } public event Action OnRelease; private readonly Optional _release=new(); public bool TryGetRelease(out T result) { result = _release.Value; if (!_release.Allow) return _release.Allow; _release.Clear(); return true; } } }