La meilleure option est probablement d'utiliser une expression lambda qui se ferme sur les variables que vous voulez afficher.
Cependant, faites attention dans ce cas, surtout si vous l'appelez dans une boucle. (Je le mentionne car votre variable est un "ID", et c'est courant dans cette situation). Si vous fermez sur la variable dans la mauvaise portée, vous pouvez obtenir un bug. Pour plus de détails, voir Le billet d'Eric Lippert sur le sujet . Cela nécessite généralement la création d'un poste temporaire :
foreach(int id in myIdsToCheck)
{
int tempId = id; // Make a temporary here!
Task.Factory.StartNew( () => CheckFiles(tempId, theBlockingCollection),
cancelCheckFile.Token,
TaskCreationOptions.LongRunning,
TaskScheduler.Default);
}
De plus, si votre code est comme celui qui précède, vous devez faire attention à l'utilisation de la fonction LongRunning
Conseil : avec l'ordonnanceur par défaut, chaque tâche obtient son propre thread dédié au lieu d'utiliser le ThreadPool. Si vous créez de nombreuses tâches, cela aura probablement un impact négatif car vous ne bénéficierez pas des avantages du ThreadPool. Il est généralement destiné à une tâche unique et longue (d'où son nom), et non à quelque chose qui serait mis en œuvre pour travailler sur un élément d'une collection, etc.