Я много раз читал, что если await встречает Таск, который ещё не выполнен, то метод возвращает незавершённый таск и выполнение продолжается в вызывающем методе.
Видимо, вы не дочитали, либо недопоняли.
Возьму ваш первый пример, но немного его видоизмению, чтобы было понятнее, что проиходит:
static async Task Method1Async()
{
Console.WriteLine("Starting Method1Async Thread id: "+ Thread.CurrentThread.ManagedThreadId);
var task = Method2Async();
await task; // До этой точки код выполняется синхронно (если таска ещё не готова)
Console.WriteLine("End Method1Async Thread id: " + Thread.CurrentThread.ManagedThreadId);
}
static async Task Method2Async()
{
Thread.Sleep(100); // Thread.Sleep - это блокирующая операция
Console.WriteLine("Starting Method2Async Thread id: "+ Thread.CurrentThread.ManagedThreadId);
await Task.Yield(); // До этой точки код выполняетя синхронно. Task.Yield освобождает поток всегда
Console.WriteLine("End Method2Async Thread id: " + Thread.CurrentThread.ManagedThreadId);
}
Подробнее можете узнать, если загуглите
TAP.docx