Dans les deux extraits suivants, le premier est-il sûr ou devez-vous faire le second ?
Par "sûr", je veux dire que chaque thread a la garantie d'appeler la méthode sur le Foo à partir de la même itération de boucle dans laquelle le thread a été créé ?
Ou devez-vous copier la référence à une nouvelle variable "locale" à chaque itération de la boucle ?
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Thread thread = new Thread(() => f.DoSomething());
threads.Add(thread);
thread.Start();
}
-
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Foo f2 = f;
Thread thread = new Thread(() => f2.DoSomething());
threads.Add(thread);
thread.Start();
}
Mise à jour : Comme indiqué dans la réponse de Jon Skeet, cela n'a rien à voir spécifiquement avec l'enfilage.
0 votes
En fait, je pense que cela a à voir avec le threading, car si vous n'utilisiez pas le threading, vous appelleriez le bon délégué. Dans l'exemple de Jon Skeet sans threading, le problème est qu'il y a 2 boucles. Ici, il n'y en a qu'une, donc il ne devrait pas y avoir de problème... sauf si vous ne savez pas exactement quand le code sera exécuté (c'est-à-dire si vous utilisez le threading - la réponse de Marc Gravell le montre parfaitement).
0 votes
Duplicata possible de Accès à la fermeture modifiée (2)
0 votes
@user276648 Cela ne nécessite pas de threading. Différer l'exécution des délégués jusqu'après la boucle serait suffisant pour obtenir ce comportement.