Je crée un programme simple en c# en utilisant le pool de threads pendant que je passe le numéro de thread en paramètre mais j'obtiens une exception (exception d'exécution (ligne 19): l'index était en dehors des limites du tableau.)

using System;
using System.Threading; 
using System.Linq;

public class Program
{
        private const byte TotalNoOfThread=10;
        private int[] arrThreadRowProcessed;
        private bool[] arrThreadRowIsCompleted;
        private void ResetThread()
        {
            arrThreadRowProcessed = new int[TotalNoOfThread];
            arrThreadRowIsCompleted = new bool[TotalNoOfThread];
        }
    
        private  void TuroverDayWise(int ThreadNo)
        {
            Console.WriteLine("From THread ="+ThreadNo);
            arrThreadRowIsCompleted[ThreadNo] = true; //Geting error on this point Index value show 10 but how
        }
        public void TuroverDayWise()
        {
            ResetThread();
            Console.WriteLine("Reset the Data..");
            for (int i = 0; i < TotalNoOfThread; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(x=>TuroverDayWise(i)));
            }
            while (arrThreadRowIsCompleted.Any(p => !p))
            {
                Thread.Sleep(2000);                
            }

        }
    
    public static void Main()
    {
        Program obj= new Program();         
        obj.TuroverDayWise();
    }
}



1
Prabhakar 8 oct. 2020 à 13:01

1 réponse

Meilleure réponse

Dans cette ligne...

ThreadPool.QueueUserWorkItem(new WaitCallback(x=>TuroverDayWise(i)));

La valeur actuelle de i est utilisée (qui est incrémentée à l'extérieur), pas la valeur, lorsqu'elle a été appelée. Vous pouvez essayer de sauvegarder la valeur i dans une variable temporaire, cela devrait fonctionner :

        for (int i = 0; i < TotalNoOfThread; i++)
        {
            int local = i;
            ThreadPool.QueueUserWorkItem(new WaitCallback(x => TuroverDayWise(local)));
        }
1
d4zed 8 oct. 2020 à 10:16