Ten kod który wstawiłeś się nie skompiluje bo Console.WriteLine nie jest asynchroniczna:
public async Task ShowString()
{
await Task.Run(() => Console.WriteLine(GetString())); //tu zwroci System.Threading.Tasks.Task`1[System.String]
await Console.WriteLine(GetString()); // tu zwroci output
}
natomiast jak damy await przed GetString(), dostaniemy wynik jaki opisałeś w komentarzach
public async Task ShowString()
{
await Task.Run(() => Console.WriteLine(GetString())); //tu zwroci System.Threading.Tasks.Task`1[System.String]
Console.WriteLine(await GetString()); // tu zwroci output
}
który jest jak najbardziej jest poprawny bo nie mamy awaita w pierwszym wywołaniu przed asynchroniczną metodą GetString()
public async Task ShowString()
{
await Task.Run(() => Console.WriteLine(await GetString())); // tu zwroci output
Console.WriteLine(await GetString()); // tu zwroci output
}
i teraz oba zwaracają to samo ;)