Gdzie jest różnica(miedzy await Task.Run a await)

0

Powiedzmy ze mam takie dwie metody

public async Task<string> GetString()
{
await Task.Run(() => {
string k = "output"
Task.Delay(1000);
return k;
});
}

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
}

I await Task.Run i await powinny chyba zwrocic to samo, co nie?

0

Z ciekawości odpaliłem program konsolowy:

using System;
using System.Threading.Tasks;

namespace Testy_09_Async_Run
{
    class Program
    {
        public async Task<string> GetString()
        {
            string a = "output2";
            await Task.Run(() => {
                Task.Delay(1000);
                string k = "output";
                return k;
            });
            return a;
        }

        public async Task ShowString()
        {
            await Task.Run(() => Console.WriteLine(GetString() + "METODA")); //tu zwroci System.Threading.Tasks.Task`1[System.String]
            Console.WriteLine("hit key a");
            Console.ReadKey();
            
            await GetString();
            Console.WriteLine("hit key b");
            Console.ReadKey();
        }
        static void Main(string[] args)
        {
            Program przyklad = new Program();
            przyklad.ShowString();
            Console.WriteLine(przyklad.GetString() + "RUN");
            Console.WriteLine("koniec");
            Console.ReadKey();
        }
    }
}

W wyniku mamy:

System.Threading.Tasks.Task`1[System.String]RUN
koniec
System.Threading.Tasks.Task`1[System.String]METODA
hit key a
1

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 ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1