Cześć
Mam mały problem ze zrozumieniem pewnej rzeczy w poniższym kodzie:
class Program
{
public static void Main(string[] args)
{
string url = "https://www.google.com/";
Console.Write($"{url} \n");
Task task = WriteWebRequestSizeAsync(url);
for (int i = 0; i < 40; ++i)
{
for (int j = 0; j != 70000000; ++j)
{
}
Console.WriteLine("wypisz tekst z metody main");
}
task.Wait();
Console.ReadKey();
}
private static async Task WriteWebRequestSizeAsync(string url)
{
WebRequest webRequest = WebRequest.Create(url);
WebResponse response = await webRequest.GetResponseAsync();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string text =
await reader.ReadToEndAsync();
Console.WriteLine(FormatBytes(text.Length));
}
for (int i = 0; i < 8; ++i)
{
for (int j = 0; j != 100000000; ++j)
{
}
Console.WriteLine("metoda async");
}
}
Czy ktoś może mi wytłumaczyć czemu pętla wypisująca w konsoli słowo "metoda async" po wykonaniu wcześniejszego kodu z metody WriteWebRequestSizeAsync (która wypisuje po wczytaniu wielkość strony) jest wykonywana w innym wątku niż metoda main? Z tego co rozumiem async w metodzie nie oznacza utworzenia nowego wątku a sterowanie cały czas jest w wątku głównym, pozwala nam to tylko na użycie await. Więc dlaczego po wykonaniu przykładowego kodu przed pętlą, ona sama jest wykonywana równolegle razem z Console.WriteLine("wypisz tekst z metody main") a nie cała przed nią. Jeżeli pętlę dam na sam początek metody to nie będzie problemu i najpierw zostanie wypisane słowo "metoda async" 8 razy a potem reszta kodu równolegle z Console.Write("wpisz tekst z metody main"). Z tego co widzę to np. w kodzie źródłowym GetResponseAsync(), metoda ta zwraca "return Task.Run(() => ..." nie ważne, ale jak to ma się do mojej pętli że jest wykonywana w innym wątku niż main? Czemu po wykonani await coś tam nagle reszta metody działa równolegle z Console.WriteLine("wypisz tekst z metody main")?
Wiem, że to trochę pokręcone ale starałem się przekazać to najlepiej jak umiem na ten moment. W załączniku znajduje się screen z konsoli.
- scrn.jpg (107 KB) - ściągnięć: 170