Measure a given method's execution time - follow-up
while (Watch.Elapsed.Milliseconds &lt; minimumTime)


It probably won't affect this code, but Milliseconds doesn't do what you probably think it does. I think you want TotalMilliseconds.



public static Task&lt;Time&gt; Measure(Action action, int? iterations = null, int times = 1)
{
    return Task.FromResult(iterations)
        .ContinueWith(async t =&gt; t.Result.GetValueOrDefault(await GetIterations(action)))
        .Unwrap()
        .ContinueWith(t =&gt;
        {
            var iters = t.Result;
            TimeSpan timeTaken = TimeSpan.MaxValue;
            for (int i = 0; i &lt; times; ++i)
            {
                timeTaken = MeasureTime(action, iters).Min(timeTaken);
            }
            return new Time(timeTaken.Ticks*100/iters);
        });
}



Generally speaking, if you can use await, you don't need ContinueWith().
What's the point of using Task.FromResult().ContinueWith()? Task.Run() would make much more sense here.
There is actually no reason to use Task and async-await here. You should use that only for truly asynchronous IO operations. If the caller wants to run your long-running CPU-bound code on a separate thread, they can easily do it themselves.
For performance-related code, it feels weird that you're calling GetIterations() even when it's not needed.