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

Aruba Cloud - Virtual Private Server VPS
+1 głos
533 wizyt
pytanie zadane 28 lutego 2020 w C# przez kubekszklany Gaduła (3,250 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 Mentor (352,580 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,250 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,250 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,250 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 452 wizyt
pytanie zadane 10 marca 2020 w C# przez JakSky Stary wyjadacz (14,770 p.)
+1 głos
2 odpowiedzi 1,006 wizyt
pytanie zadane 2 lipca 2021 w C# przez tomasz12345 Użytkownik (750 p.)
0 głosów
2 odpowiedzi 1,582 wizyt
pytanie zadane 5 lutego 2020 w C# przez kubekszklany Gaduła (3,250 p.)

93,335 zapytań

142,330 odpowiedzi

322,409 komentarzy

62,670 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...