J'ai un problème avec lorsque le dossage code> est exécuté, il reçoit la dernière valeur de chaque variable capturée au lieu de la valeur que je souhaite. Je peux imaginer une solution pour cela, mais cela imagine que vous pouvez trouver de meilleures solutions p> p>
4 Réponses :
Le moyen canonique de résoudre est de copier les valeurs en variables temporaires déclarées à l'intérieur em> la boucle. foreach(var category in categories)
{
var catCopy = category;
foreach(var word in words)
{
var wordCopy = word;
var waitCallback = new WaitCallback(state =>
{
DoSomething(wordCopy, catCopy);
});
ThreadPool.QueueUserWorkItem(waitCallback);
}
}
Excellent, merci. Vous avez rayé la tête sur celle-ci pendant environ une heure. Donc, chaque boucle instancite d'une nouvelle variable locale, chacune d'elles qui est capturée indépendamment des autres - l'a eu.
Pour référence, j'imagine que ce qui suit résoudrait mon problème:
Oui, vous pouvez également utiliser un tuple
@Henk qui nécessite .net 4.0
Ce que je considère maintenant la valeur par défaut: sauf indication contraire.
J'écrirais tout ce qui est comme celui-ci, qui esquit le problème et ne laisse absolument aucune question sur ce qui se passe:
refacteur IT à: ceci est simple et facile à comprendre. Il indique la intention du développeur em> sans encombrer le code avec des variables supplémentaires (comme de la manière par défaut de résoudre ce problème). P> P>
@MQuander: Peut-être une question de goût, mais c'est fondamentalement le même principe. Dans le cas de la fonction, la copie est faite implicitement via les paramètres de fonction.
duplicache possible de Comment a Lambda en C # Bind to the Enumerator dans une foreach?
Je ne conviens pas que c'est un duplicata. Ce message demande pourquoi le comportement arrive; Cet article demande quelle est la meilleure façon d'écrire ce code pour éviter le problème.