Лучшим вариантом, вероятно, является использование лямбда-выражения, закрывающего переменные, которые вы хотите отобразить.
Однако будьте осторожны в этом случае, особенно если вы вызываете это в цикле. (Я упоминаю об этом, поскольку ваша переменная является «идентификатором», и это обычно встречается в этой ситуации.) Если вы закроете переменную в неправильной области, вы можете получить ошибку. Подробнее см. пост Эрика Липперта по теме . Обычно для этого требуется сделать временное:
foreach(int id in myIdsToCheck)
{
int tempId = id; // Make a temporary here!
Task.Factory.StartNew( () => CheckFiles(tempId, theBlockingCollection),
cancelCheckFile.Token,
TaskCreationOptions.LongRunning,
TaskScheduler.Default);
}
Кроме того, если ваш код подобен приведенному выше, вы должны быть осторожны с подсказкой LongRunning
- с планировщиком по умолчанию, это заставляет каждую задачу получать свой собственный выделенный поток вместо использования ThreadPool. Если вы создаете много задач, это может оказать негативное влияние, поскольку вы не получите преимуществ ThreadPool. Как правило, он предназначен для одной длительной задачи (отсюда и ее имя), а не для реализации над элементом коллекции и т. Д.