2009-03-17 16 views

Respuesta

12

No es 100% claro en lo que estás preguntando.

¿Estás preguntando si las lambdas se ejecutan naturalmente en un hilo diferente?

Si es así, son solo otra instancia de System.Delegate y se ejecutan en el hilo principal a menos que se solicite específicamente lo contrario.

¿Estás preguntando si es seguro ejecutarlos en varios subprocesos?

Esta es una pregunta que solo puede responderse conociendo el contenido de la expresión lambda. No son intrínsecamente seguros para hilos. En mi experiencia, es mucho menos probable que sean seguras para subprocesos de lo que cabría esperar.

+0

Gracias. Estaba preguntando # 1. –

+0

s/hilo principal/hilo actual/como su donde se ejecuta el delegado. – Richard

6

No, se ejecutan en el hilo en el que se crean a menos que lo pase a otro hilo, como cualquier otro método. No querrás que se ejecuten en un hilo diferente automáticamente, créeme.

+0

pedante: es el hilo en el que se ejecuta el delegado (por ejemplo, crear en un hilo, pasar como referencia a otro y el delegado es ejecutado allí). – Richard

2

Bueno, una lambda es solo un método anónimo, se ejecuta en cualquier hilo al que se llame, a menos que proporciones código para ejecutar en un hilo separado.

3

En la próxima versión de C#, están agregando opciones de subprocesamiento múltiple a LINQ (llamado PLINQ) y delega. Echa un vistazo a más información here. Actualmente, todo está en un solo hilo.

+0

Bueno, está en los hilos * que * elija usar ... no necesariamente solo el que. –

+0

También estoy bastante seguro de que va a ser puramente una biblioteca, no una cosa específica de C#. –

+0

sí, probablemente debería decir la próxima versión de .net. disculpas. – Shawn

3

Como han dicho otros, las expresiones lambda no son intrínsecamente de subprocesos múltiples, ni los métodos estándar de extensión de linq a objetos hacen nada especial para llamarlos en subprocesos separados.

Sin embargo, si desea hacer una programación de subprocesos múltiples similar a linq, debe consultar Parallel Extensions to .NET Framework. También consulte este enlace:
http://blogs.msdn.com/pfxteam/

Lamentablemente, esto no será RTM hasta que VS2010/.Net4.0 esté fuera.

2

Las expresiones Lambda son solo métodos como cualquier otro. ¿Qué hace que un método multiproceso?

  • Sin acceso a los campos externos (método de entrada/salida sencilla) - un procedimiento de este tipo siempre es multiproceso
  • acceso a un campo sincronizada - considere escenario de sincronización (Monitor clase, bloqueo de lectura/escritura, Interlocked acceso, WaitHandle, etc.), minimiza las disputas de bloqueo.
  • Acceso a una variable capturado (cierre) - asegúrese de que la variable capturada no cambia, siempre y cuando otros hilos utilizan (cómo se accede a la variable: simplemente lee, lee y escribe ...)

El compilador C# es lo suficientemente inteligente como para saber si se generan métodos estáticos o de instancia para sus lambdas.

+0

Gracias. Cuando dijiste "¿Qué hace que un método tenga múltiples subprocesos?", ¿Quisiste decir que estas directrices lo hacen seguro o multihilo cuando se ejecuta? –

+0

Quiero decir multiproceso es seguro para subprocesos. Si se llama a un método (o lambda) desde diferentes subprocesos, se ejecuta en cada subproceso por separado, es decir, cada subproceso tiene su propia pila de llamadas. –

2

Respuesta potencialmente confusa (pero verdadera).En algunos escenarios comúnmente encontrados, una lambda puede ejecutarse en otra máquina, en un tipo completamente diferente de entorno de tiempo de ejecución y, por lo tanto, en otra secuencia, y la persona que llama no tiene por qué esperar a que la ejecución remota se complete por completo antes de continuar.

(En concreto, si se le pasa a una consulta LINQ to SQL.)

+0

Buen punto, incluso si no es la ejecución más directa y no local – Pierreten