c# Thread delegate i takie tam

0

Witajcie.
Od niedawna programuję w .NET.
Próbuję zaimplementować wątki. Chcę wykonywać w tle dwie kopiue tej samej metody.
Ogólny zarys przedstawia poniższy kod.

Uruchomienie programu powoduje wyjątek, gdyż w metodzie wątku przekazywane intA ma wartość 5.
Nie rozumiem tego.
Główna pętla puszczająca te wątki jest ograniczona intA < 5 (tabElementy.Length).
W niej co prawda wykonuję intA++ jednak kolejny wątek puszczam po uprzednim sprawdzeniu powyższego warunku. Nie dochodzi nigdy do przekazania intA o wartości 5 do wątku, a jednak metoda, która już się wykonuję otrzymuję wartość 5.
Tak jakbym przekazywał tylko referencję do zmiennej do tej metody pracującej w wątku i wtedy jak program główny ją zmieni to również zmieni się tam.

Możecie pomóc mi w zrozumieniu, co robię źle?

[c#]
private Metoda_Thread(int intA, string [] tablica)
{
 int wA = intA;
 string bufor = "";
 bufor = tablica [wA];
}

public Metoda1()
{
 Thread [] tabTrd = new Thread [5];
 string[] tabElementy = {"1", "2", "3", "4", "5"}; 

 for (intA = 0; intA < tabElementy.Length; intA++)
 {
  ThreadStart zadanie = delegate {Metoda_Thread(intA, tabElementy); };
  tabTrd[0] = new Thread(zadanie);
  tabTrd[0].IsBackground = true;
  tabTrd[0].Start();

  intA++;

  if (intA<tabElementy.Length)
   {
    ThreadStart zadanie = delegate {Metoda_Thread(intA); };
    tabTrd[1] = new Thread(zadanie);
    tabTrd[1].IsBackground = true;
    tabTrd[1].Start();
   }

 }
}
0
dex80 napisał(a)

Witajcie.
Od niedawna programuję w .NET.
Próbuję zaimplementować wątki. Chcę wykonywać w tle dwie kopiue tej samej metody.
Ogólny zarys przedstawia poniższy kod.

Uruchomienie programu powoduje wyjątek, gdyż w metodzie wątku przekazywane intA ma wartość 5.
Nie rozumiem tego.
Główna pętla puszczająca te wątki jest ograniczona intA < 5 (tabElementy.Length).
W niej co prawda wykonuję intA++ jednak kolejny wątek puszczam po uprzednim sprawdzeniu powyższego warunku. Nie dochodzi nigdy do przekazania intA o wartości 5 do wątku, a jednak metoda, która już się wykonuję otrzymuję wartość 5.
Tak jakbym przekazywał tylko referencję do zmiennej do tej metody pracującej w wątku i wtedy jak program główny ją zmieni to również zmieni się tam.

Możecie pomóc mi w zrozumieniu, co robię źle?

[c#]
private Metoda_Thread(int intA, string [] tablica)
{
 int wA = intA;
 string bufor = "";
 bufor = tablica [wA];
}

public Metoda1()
{
 Thread [] tabTrd = new Thread [5];
 string[] tabElementy = {"1", "2", "3", "4", "5"}; 

 for (intA = 0; intA < tabElementy.Length; intA++)
 {
  ThreadStart zadanie = delegate {Metoda_Thread(intA, tabElementy); };
  tabTrd[0] = new Thread(zadanie);
  tabTrd[0].IsBackground = true;
  tabTrd[0].Start();

  intA++;

  if (intA<tabElementy.Length)
   {
    ThreadStart zadanie = delegate {Metoda_Thread(intA); };
    tabTrd[1] = new Thread(zadanie);
    tabTrd[1].IsBackground = true;
    tabTrd[1].Start();
   }

 }
}

oczywiście pomijając fakt że metody nie zwracają nawet voida i intA nie jest nigdzie zadeklarowany to:

[c#]
private Metoda_Thread(int intA, string [] tablica)
{
 int wA = intA;
 string bufor = "";
 bufor = tablica [wA];
}

public Metoda1()
{
 Thread [] tabTrd = new Thread [5];
 string[] tabElementy = {"1", "2", "3", "4", "5"}; 

 for (intA = 0; intA < tabElementy.Length; intA++)
 {
int intB = intA;
  ThreadStart zadanie = delegate {Metoda_Thread(intB, tabElementy); };
  tabTrd[0] = new Thread(zadanie);
  tabTrd[0].IsBackground = true;
  tabTrd[0].Start();

  intA++;

  if (intA<tabElementy.Length)
   {
int intC = intA;
    ThreadStart zadanie = delegate {Metoda_Thread(intC); };
    tabTrd[1] = new Thread(zadanie);
    tabTrd[1].IsBackground = true;
    tabTrd[1].Start();
   }

 }
}
Powinno rozwiązać problem.
0

Dzięki grangu za odpowiedź.
Zadziałało, ale czy możesz mi tylko w dwóch zdania opowiedzieć o co chodzi?
Dzięki z góry.

0
dex80 napisał(a)

Dzięki grangu za odpowiedź.
Zadziałało, ale czy możesz mi tylko w dwóch zdania opowiedzieć o co chodzi?
Dzięki z góry.

Przypuszczam że jest tak jak mówisz czyli do funkcji zostaje podana jedynie referencja a nie wartość zmiennej jeśli stworzysz sobie nowego inta który istnieje tylko w tym ifie to nawet jak podasz jego referencje do funkcji jego zmiana nie będzie miała żadnego wpływu na dalszą pracę.

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