Asynchronously wait for a task to complete and do some async action while waiting
public delegate Task AsyncAction();


Instead of creating a custom delegate type, you could just reuse Func&lt;Task&gt; (even though logically, it is an action and not a function).



return Task.FromResult(true);


Consider adding an overload that takes a non-async onTimeout delegate, so that this confusing code wasn't required.

Or, if you do something like this often, have some TaskEx.Completed, or something like that.



Otherwise, good job. I especially like that you remembered to use ConfigureAwait(false) everywhere.