Sé que las expresiones .NET lambda pueden capturar variables externas. Sin embargo, he visto muchas veces que las variables se pasan explícitamente a la expresión lambda como parámetro, y la biblioteca .NET también parece soportar eso (por ejemplo, ThreadPool.QueueUserWorkItem).Expresiones lambda, variables capturadas y subprocesamiento
Mi pregunta es, ¿cuáles son las limitaciones de estas capturas? ¿Qué hay de las lambdas que se ejecutan realmente en un subproceso diferente del que se crearon (por ejemplo, ThreadPool.QueueUserWorkItem o Thread) o lambas que actúan como devoluciones de llamada (es decir, se invocan más adelante)?
En general, ¿cuándo debo confiar en las variables capturadas y cuándo usar los parámetros explícitos? Por ejemplo:
public void DoStuff()
{
string message = GetMessage();
ThreadPool.QueueUserWorkItem(s => SendMessage(message)); // use captured variable
// -- OR --
ThreadPool.QueueUserWorkItem(s =>
{
string msg = (string)s;
SendMessage(msg);
}, message); // use explicit parameter
}
¡Gracias!
Actualización: se corrigió el segundo ejemplo de ThreadPool.QueueUserWorkItem.
Tienes razón, me perdí el parámetro en la segunda parte del ejemplo. Entonces, según tengo entendido, en la práctica no importa cuál use, pero me recomendaría ir con las variables capturadas, debido a su simplicidad (y legibilidad). ¡Muchas gracias por su respuesta detallada! – ShdNx