using System.Threading.Tasks;
public static async Task Main()
var progress = new TimerProgress<int>((int value) => reportValue = value);
await Task.Delay(TimeSpan.FromSeconds(2));
var s = progress._counter;
public class TimerProgress<T> : IProgress<T>
private readonly TimeSpan _intervalInMilliseconds;
private readonly IProgress<T> _progress;
private DateTime? _lastReportedOn;
public TimerProgress(Action<T> handler, double intervalInMillieconds = 1000)
if (intervalInMillieconds <= 0)
throw new ArgumentOutOfRangeException(nameof(intervalInMillieconds));
_intervalInMilliseconds = TimeSpan.FromMilliseconds(intervalInMillieconds);
_progress = new Progress<T>(handler);
_lastReportedOn = DateTime.UtcNow;
public void Report(T value)
var now = DateTime.UtcNow;
if (now - _lastReportedOn > _intervalInMilliseconds)