using System.Threading.Tasks;
using System.Diagnostics;
public static void Main()
public static async Task AsyncMain()
var results = await TimeMeasurer.Start(() => Function(a,b));
Console.WriteLine("Waited: {0}", results.Duration.TotalSeconds);
Console.WriteLine("Result: {0}", results.Result);
public static async Task<int> Function(int a, int b)
public class TimeMeasurerResult
protected readonly Task _task;
private readonly TimeSpan _duration;
public TimeMeasurerResult(Task task, TimeSpan duration)
public Task Task {get { return _task;}}
public TimeSpan Duration {get {return _duration;}}
public class TimeMeasurerResult<T> : TimeMeasurerResult
public TimeMeasurerResult(Task<T> task, TimeSpan duration)
public T Result {get { return ((Task<T>)_task).Result;}}
public static class TimeMeasurer
public static async Task<TimeMeasurerResult<TReturn>> Start<TReturn>(Func<Task<TReturn>> function)
var stopWatch = Stopwatch.StartNew();
var took = stopWatch.Elapsed;
return new TimeMeasurerResult<TReturn>(task, took);
public static async Task<TimeMeasurerResult> Start(Func<Task> function)
var stopWatch = Stopwatch.StartNew();
var took = stopWatch.Elapsed;
return new TimeMeasurerResult(task, took);