J'allais poser une question, mais je l'ai compris à l'avance et j'ai décidé d'afficher la question et la réponse - ou du moins mes observations. Lorsque vous utilisez un délégué anonyme en tant que WaitCallback, où ThreadPool.QueueUserWorkItem est appelé dans une boucle foreach, il semble que le même foreach-value soit transmis à chaque thread.Utilisation de délégués anonymes avec .NET ThreadPool.QueueUserWorkItem
List<Thing> things = MyDb.GetTheThings();
foreach(Thing t in Things)
{
localLogger.DebugFormat("About to queue thing [{0}].", t.Id);
ThreadPool.QueueUserWorkItem(
delegate()
{
try
{
WorkWithOneThing(t);
}
finally
{
Cleanup();
localLogger.DebugFormat("Thing [{0}] has been queued and run by the delegate.", t.Id);
}
}
}
Pour une collection de 16 instances de chose choses que je remarquai que chaque « chose » est passé à WorkWithOneThing correspond au dernier élément de la liste des « choses ».
Je suppose que c'est parce que le délégué accède à la variable externe 't'. Notez que j'ai également expérimenté en passant le Thing comme paramètre au délégué anonyme, mais le comportement est resté incorrect.
Lorsque j'ai recréé le code pour utiliser une méthode nommée WaitCallback et que j'ai passé le Thing 't' à la méthode, alto ... la iième instance de Things a été correctement passée dans WorkWithOneThing.
Une leçon de parallélisme je suppose. J'imagine aussi que la famille Parallel.For répond à cela, mais cette bibliothèque n'était pas une option pour nous à ce stade.
Espérons que cela sauvera quelqu'un d'autre.
Howard Hoffman
Si vous essayez de compiler ce code, ne vous obtiendrez une erreur « System.Threading.WaitCallback » ne prend pas les arguments 0 ' » comme vous ne spécifiez pas – ram
Ram param - Essayez de changer la déclaration ci-dessus de: délégué() { ...} à délégué { ...} C'est ce que je devais être avant de faire mon changement. J'espère que cela vous aide. –