2010-06-28 16 views
6

estoy usando ThreadPool con el código follwoing: -operador => en el código

ThreadPool.QueueUserWorkItem 
       (o => 
       MyFunction() 
       ); 

No estoy seguro de lo que hace o=> hace en este código. Puede alguien ayudarme.

+0

Creo que significa '() => MyFunction()', este es un lambda sin un parámetro –

+0

@Mystere hombre QueueUserWorkItem espera una instancia de WaitCallback que es un delegado de métodos que toman y el objeto y vuelve vacía . Entonces, aunque extraño, la firma es correcta. –

Respuesta

11

Describe una función lambda (anónima). En este caso, es una función que toma un argumento, o, y luego ejecuta MyFunction (aunque en este caso, básicamente está arrojando el valor de o away). Es equivalente a:

void Foo(object o) //We know that Foo takes an object and returns void because QueueUserWorkItem expects an instance of type WaitCallback which is a delegate that takes and object and returns void 
{ 
    MyFunction(); 
} 

ThreadPool.QueueUserWorkItem(Foo) // or ThreadPool.QueueUserWorkItem(new WaitCallback(Foo)); 

El tipo de o se infiere sobre la base de lo QueueUserWorkItem espera. QueueUserWorkItem espera el tipo WaitCallback, por lo que en este caso o debería ser del tipo type porque WaitCallback es delegate para los métodos con un parámetro del tipo object que devuelve void.

En cuanto al que significa de este fragmento de código en particular; básicamente está agregando una función (elemento de trabajo) a una cola que será ejecutada por uno de los hilos del grupo (cuando esté disponible). Ese fragmento de código en particular simplemente describe una forma bonita y concisa de pasar la función sin tener que tomarse la molestia de definir completamente un método de clase.

Por cierto, yo, y otros, tienden a leer => como 'tal que'. Algunas personas lo leen como 'va a'.

+1

Solo para aclarar, => es el operador y o se está transfiriendo el parámetro. Eche un vistazo a http://msdn.microsoft.com/en-us/library/bb397687.aspx para obtener más detalles. – lzcd

+0

@lzcd: No lo llamaría un operador. Es solo la sintaxis que separa los parámetros del cuerpo de la lambda. – porges

+1

Si entiendo correctamente, entonces si quiero pasar algunos parámetros a mi función, entonces puedo hacerlo así: - ThreadPool.QueueUserWorkItem (o => MyFunction (o)); –

2

Está declarando un método anónimo. Básicamente, está pasando un método cuyo cuerpo es { MyFunction(); } como parámetro del método QueueUserWorkItem. No he comprobado, pero también debería ser también equivalente a:

ThreadPool.QueueUserWorkItem(MyFunction); 
+2

No del todo, no lo creo. QueueUserWorkItem espera que un delegado acepte un objeto como argumento; de ahí envolviendo 'MyFunction' en una lambda. – Anthony

3

Ésta es la sintaxis de C# para una expresión lambda.

Es de muchas maneras definiciones en línea delegado. Le ahorra la tediosidad de definir una función adicional para usar como objetivo delegado.

private object Target(object state) { 
    MyFunction(); 
} 

... 
ThreadPool.QueueUserWorkItem(new WaitCallback(Target));