using System; using System.Reactive.Subjects; using System.Threading; using System.Threading.Tasks; using DHT.Utils.Logging; namespace DHT.Utils.Tasks; public sealed class ObservableThrottledTask : IObservable, IDisposable { private readonly ReplaySubject subject; private readonly ThrottledTask task; public ObservableThrottledTask(Log log, TaskScheduler resultScheduler) { this.subject = new ReplaySubject(bufferSize: 1); this.task = new ThrottledTask(log, subject.OnNext, resultScheduler); } public void Post(Func> resultComputer) { task.Post(resultComputer); } public IDisposable Subscribe(IObserver observer) { return subject.Subscribe(observer); } public void Dispose() { task.Dispose(); subject.OnCompleted(); subject.Dispose(); } }