Using Stephen Cleary's excellent AsyncEx library, you can do:
TimeSpan timeout = TimeSpan.FromSeconds(10);
using (var cts = new CancellationTokenSource(timeout))
{
await myTask.WaitAsync(cts.Token);
}
TaskCanceledException
will be thrown in the event of a timeout.