• 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.

Object Storage Arubacloud
+1 głos
291 wizyt
pytanie zadane 28 lutego 2020 w C# przez kubekszklany Gaduła (3,190 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 (344,860 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,190 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,190 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,190 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 342 wizyt
pytanie zadane 10 marca 2020 w C# przez JakSky Stary wyjadacz (14,770 p.)
+1 głos
2 odpowiedzi 650 wizyt
pytanie zadane 2 lipca 2021 w C# przez tomasz12345 Użytkownik (750 p.)
0 głosów
2 odpowiedzi 1,108 wizyt
pytanie zadane 5 lutego 2020 w C# przez kubekszklany Gaduła (3,190 p.)

92,555 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,941 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...