wątki C#

0

Pisze program w C# oparty na watkach , w ktorym wystepuje nastepujaca deklaracja(do kazdego z watkow
przypisana jest funkcja "downloading" uruchamiana z
obiektu typu "EMule") :

EMule []clients = new EMule[nPeers];

Thread[] threads = new Thread[nPeers];


for (i = 0; i < nPeers; i++) clients[i] = new EMule(updownRate(rates, mUpload), updownRate(rates, mDownload), nFiles, pieces, rand);

for (i = 0;i < nPeers-1; i++)

threads[i] = new Thread(delegate()

{

clients[i].downloading(clients[i+1]);

});

threads[nPeers - 1] = new Thread(delegate()

{

clients[nPeers - 1].downloading(clients[0]);

});

Następnie uruchamiam watki:


for (i = 0; i < nPeers; i++) threads[i].Start();

Program reaguje bardzo roznie , jednak zawsze konczy sie na bledzie:

IndexOutOfRangeException w linijce:


for (i = 0;i < nPeers-1; i++)

threads[i] = new Thread(delegate()

{

clients[i].downloading(clients[i+1]);<--------- ta linijka smile

});

Sytuacja dla mnie kompletnie nie zrozumiala jako że

liczba zaalokowanych klientow jest OK. Patrzylem tez na to w debugerze i nie wyglada na to zeby zakres zostal przekroczony

Co ciekawe kiedy do wątków przypisze funkcje nie uzywajac petli for tylko "na pale",tak jak tutaj:

threads[0] = new Thread(delegate()

{

clients[0].downloading(clients[1]);

});

threads[1] = new Thread(delegate()

{

clients[1].downloading(clients[2]);

});

itp...
program dziala bezproblemowo. Strasznie sie z tym mecze prosze o jakies sugesti i z gory dziekuje za pomoc.</cpp>

0
for (i = 0;i < nPeers-1; i++) 
    threads[i] = new Thread(delegate()


Następnie uruchamiam watki:
for (i = 0; i < nPeers; i++)   //W poprzedniej pętli dodajesz delegacje do indexu tablicy nPeers-2 a tu wywołujesz nPeers-1
    threads[i].Start();

Problem jest taki, że odwołujesz się do indexu tablicy threads, do którego nic nie wrzuciłeś.

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