• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C# błędna kolejność wykonywania kodu.

VPS Starter Arubacloud
+1 głos
385 wizyt
pytanie zadane 28 lutego 2020 w C# przez kubekszklany Gaduła (3,230 p.)

Witam. Może mi ktoś wyjaśnić dlaczego po wykonaniu tego kodu dostaję w konsoli 1 a nie 0? Przecież w funkcji B jest nowa deklaracja zmiennej Y, więc dlaczego mam wartość X podniesioną o 1? Dlaczego Task.Run wykonuje się później niż X++? Zawsze myślałem że kod wykonuje się linijka po linijce, a nie losowo...

void A()
{
	int X = 0;
	Task.Run(() => B(X));
	X++;
}

void B(int Y)
{
	Console.Log("Number: " + Y);
}

1 odpowiedź

+2 głosów
odpowiedź 29 lutego 2020 przez adrian17 Ekspert (348,220 p.)
wybrane 29 lutego 2020 przez kubekszklany
 
Najlepsza

Zawsze myślałem że kod wykonuje się linijka po linijce, a nie losowo...

Tak, ale... ale używając Task zacząłeś się bawić z programowaniem współbieżnym.

W każdym razie, za dokumentacją:

.https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.run?view=netcore-3.1

Queues the specified work to run on the ThreadPool

Task.Run wykonuje się normalnie, ale funkcja którą mu przekazałeś `() => B(X)` zostaje wykonana dopiero po nieokreślonym czasie.

komentarz 29 lutego 2020 przez kubekszklany Gaduła (3,230 p.)
To jaki byłby najprostszy sposób, aby do funkcji przekazywana była wartość 0 a nie 1?
komentarz 29 lutego 2020 przez Fikter Początkujący (280 p.)

Można by to w taki sposób rozwiązać. A najszybciej to było by pozbyć się wykonywania taska i zrobić to po prostu w tym samy wątku.

komentarz 29 lutego 2020 przez kubekszklany Gaduła (3,230 p.)

Gdybym mógł się pozbyć taska to bym się go pozbył, twój kod sprawia że wykonuje się synchronicznie. Aktualnie zrobiłem to w ten sposób:

Task X = Task.Run(() => Y(Z));
while(X.Status < TaskStatus.Running)
{
    Thread.Sleep(1);
}

I dzięki temu wiem że task zacznie się wykonywać zanim kod pójdzie dalej, tylko nie wiem czy to jest najlepsze rozwiązanie. Ale zauważyłem 1 rzecz ciekawą u ciebie, używasz słowa ref, co ono dokładnie oznacza?

komentarz 29 lutego 2020 przez Fikter Początkujący (280 p.)
To prawda, że mój przykład wykonuje się synchronicznie, ale twój także :D

Mój przykład -> start task -> czekaj, aż się skończy.

Twój przykład -> start task -> wykonuj pętle sprawdzającą status taska. Co też jest błędne, ponieważ, gdy status będzie równy np. Canceled, to pętla dalej będzie się wykonywać w nieskończoność.  

Co do słowa ref w skrócie oznacza, że jest przekazywana referencja do zmiennej, a nie sama wartość, zwróć uwagę, że metoda wykonująca się w tasku wykonuje na koniec inkrementalne zmiennej y.
1
komentarz 29 lutego 2020 przez kubekszklany Gaduła (3,230 p.)

gdy status będzie równy np. Canceled, to pętla dalej będzie się wykonywać w nieskończoność

No chyba jednak nie do końca, bo status Running ma wartość 3, a status Cancelled 6 (zauważ znak mniejszości, a nie równości). Poza tym nie jest synchroniczna, tylko czeka aż wystartuje, jak tylko task się utworzy (wartość 1), "przygotuje" (wartość 2) i uruchomi (wartość 3) pętla while się kończy i obie funkcje wykonują się równocześnie. Wiem, bo sprawdzałem. :)

1
komentarz 1 marca 2020 przez Fikter Początkujący (280 p.)
Racja, moje niedopatrzenie.

Podobne pytania

+1 głos
2 odpowiedzi 362 wizyt
pytanie zadane 10 marca 2020 w C# przez JakSky Stary wyjadacz (14,770 p.)
+1 głos
2 odpowiedzi 789 wizyt
pytanie zadane 2 lipca 2021 w C# przez tomasz12345 Użytkownik (750 p.)
0 głosów
2 odpowiedzi 1,294 wizyt
pytanie zadane 5 lutego 2020 w C# przez kubekszklany Gaduła (3,230 p.)

92,832 zapytań

141,777 odpowiedzi

320,824 komentarzy

62,164 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...