Обработка исключений из синхронной части асинхронного метода

Я имею дело с ситуацией, когда запускаемая мною задача может выполняться одновременно с одновременным выполнением в начальном потоке. Примерно так, в иллюстративных целях:

static async Task TestAsync()
{
    var random = new Random(Environment.TickCount).Next();
    if (random % 2 != 0)
        throw new ApplicationException("1st");

    await Task.Delay(2000);
    Console.WriteLine("after await Task.Delay");
    throw new ApplicationException("2nd");
}

Из вызывающего кода я хотел бы иметь возможность перехватывать любые исключения, возможно, выбрасываемые из синхронной части (т.е. доawait Task.Delay()). Вот как я сейчас это делаю:

static void Main(string[] args)
{
    try
    {
        var task = TestAsync();
        if (task.IsFaulted)
            task.GetAwaiter().GetResult();
        Console.WriteLine("TestAsync continues asynchronously...");
    }
    catch (Exception e)
    {
        Console.WriteLine("Error: " + e.ToString());
    }

    Console.WriteLine("Press Enter to exit...");
    Console.ReadLine();
}

Это работает, хотя выглядит немного глотком, так как нетResult наTask.

Я также пыталсяtask.Wait() вместоtask.GetAwaiter().GetResult(), Это всегда дает мнеAggregateException который я должен развернуть (а не как ожидалосьApplicationException напрямую).

Есть ли другие варианты?

[EDITED] Чтобы обратиться к комментариям: я делаю это, потому что, если задача не выполняется мгновенно, я не хочу добавлять ее в список ожидающих задач, которые я поддерживаю. Сама задача ничего не знает о таком списке (и не обязана). Я все еще хочу зарегистрировать исключение и информировать об этом пользователя. Я мог бы также сделатьthrow task.Exception, но это не дало бы кадр стека исключений, захваченный сExceptionDispatchInfo.

[ОБНОВИТЬ] Вдохновлен другими ответами и комментариями: если у меня есть полный контроль надTestAsync и я не хочу представлять новых учеников, я также мог бы сделать что-то вроде ниже. Это может пригодиться при проверке аргументов:

static Task TestAsync(int delay)
{
    if (delay < 0)
        throw new ArgumentOutOfRangeException("delay");

    Func<Task> asyncPart = async () =>
    {
        Console.WriteLine("await Task.Delay");
        await Task.Delay(delay);
        throw new ApplicationException("2nd");
    };

    return asyncPart();
}

Ответы на вопрос(2)

Ваш ответ на вопрос