public static void Main()
IProgress<int> progress = new Progress<int>(value => Print($"Progress: {value}"));
Console.WriteLine(progress);
public class SynchronousProgress<T> : IProgress<T>
private readonly Action<T> _handler;
private readonly SynchronizationContext _synchronizationContext;
public SynchronousProgress(Action<T> handler)
ArgumentNullException.ThrowIfNull(handler);
_synchronizationContext = SynchronizationContext.Current;
public void Report(T value)
if (_synchronizationContext is not null)
_synchronizationContext.Send(s => _handler((T)s), value);
private static void Print(object value)
Console.WriteLine($@"{DateTime.Now:HH:mm:ss.fff} [{Thread.CurrentThread
.ManagedThreadId}] > {value}");