La mejor opción es probablemente utilizar una expresión lambda que cierre las variables que desea visualizar.
Sin embargo, tenga cuidado en este caso, especialmente si está llamando esto en un bucle. (Menciono esto ya que su variable es una "ID", y esto es común en esta situación). Si cierra la variable en el ámbito incorrecto, puede obtener un error. Para más detalles, vea Eric Lippert's post on the subject. Esto normalmente requiere hacer un temporal:
foreach(int id in myIdsToCheck)
{
int tempId = id; // Make a temporary here!
Task.Factory.StartNew(() => CheckFiles(tempId, theBlockingCollection),
cancelCheckFile.Token,
TaskCreationOptions.LongRunning,
TaskScheduler.Default);
}
Además, si su código es igual que el anterior, se debe tener cuidado con el uso de la pista LongRunning
- con el programador predeterminado, esto hace que cada tarea de conseguir su propio hilo dedicado en lugar de usar ThreadPool. Si está creando muchas tareas, es probable que esto tenga un impacto negativo ya que no obtendrá las ventajas de ThreadPool. Es normalmente orientados para una sola, la tarea de larga ejecución (de ahí su nombre), no es algo que se pondría en práctica para trabajar en un elemento de una colección, etc.
Gracias. Los iniciaré en un bucle. Sin embargo, lo necesito como LongRunning. Mi programa original funcionaba con un archivo pero ahora necesita hacer un código en numerosos archivos. Por lo tanto, necesito pasar el ID, BlockingCollection, CancellationTokenSoure y StreamReader. No agregué esos parámetros de método adicionales en la pregunta sin embargo – Jon
@Jon: Solo asegúrate de verificar el alcance de esos objetos ... Acabo de mencionar la sugerencia de LongRunning como algo para que consideres - Diré que rara vez es una buena idea utilizar LongRunning, especialmente en .NET 4, si está iniciando muchas tareas (es decir, trabajando en un bucle), ya que el threadpool generalmente proporcionará un mejor comportamiento. –
El ciclo es solo para comenzar las tareas. Máximo de 4-6 – Jon