J'ai rencontré une situation où les tâches que je crée ne semblent fonctionner que lorsque je débogue le code.
Comme vous le verrez ci-dessous, je continue à obtenir une exception d'index hors plage, ce qui ne devrait pas être possible puisque la boucle ne devrait jamais atteindre 5.
Si j'ajoute un point d'arrêt à la boucle et que je continue à appuyer sur F10 jusqu'à la fin du programme, tout fonctionne comme prévu.
Une idée de ce que je fais mal ?
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
List<int> nums = new List<int>();
var tasks = new Task[5];
for (int i = 0; i < numbers.Length; i++)
{
tasks[i] = Task.Factory.StartNew(() =>
{
nums.Add(numbers[i]);
},
TaskCreationOptions.None);
}
Task.WaitAll(tasks);
for (int i = 0; i < nums.Count; i++)
{
Console.WriteLine(nums[i]);
}
Console.ReadLine();
}
}
}
Je m'attendrais à voir 1, 2, 3, 4, 5, mais pas dans un ordre particulier, car l'exécution est asynchrone.
Bizarrement, cela fonctionne, mais je ne vois pas la différence, si ce n'est la saisie supplémentaire.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
List<int> nums = new List<int>();
var tasks = new Task[5]
{
Task.Factory.StartNew(() => {nums.Add(numbers[0]);}, TaskCreationOptions.None),
Task.Factory.StartNew(() => {nums.Add(numbers[1]);}, TaskCreationOptions.None),
Task.Factory.StartNew(() => {nums.Add(numbers[2]);}, TaskCreationOptions.None),
Task.Factory.StartNew(() => {nums.Add(numbers[3]);}, TaskCreationOptions.None),
Task.Factory.StartNew(() => {nums.Add(numbers[4]);}, TaskCreationOptions.None)
};
Task.WaitAll(tasks);
for (int i = 0; i < nums.Count; i++)
{
Console.WriteLine(nums[i]);
}
Console.ReadLine();
}
}
}
Remerciements
Mike