2010-06-28 14 views
6

sto usando ThreadPool con il codice follwoing: -Qual è operatore => in questo codice

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

io non sono sicuro di quello che fa o=> fa in questo codice. Qualcuno mi può aiutare.

+0

Credo che si intende '() => MyFunction()', questa è una lambda senza un parametro –

+0

@Mystere Man QueueUserWorkItem aspetta un'istanza di WaitCallback che è un delegato per i metodi che prendono e degli oggetti e restituire void . Quindi, anche se strano, la firma è corretta. –

risposta

11

Descrive una funzione lambda (anonima). In questo caso è una funzione che accetta un argomento, o, e quindi esegue MyFunction (anche se in questo caso è fondamentalmente il lancio del valore di o). E '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)); 

Il tipo di O è dedotto sulla base di ciò che si aspetta QueueUserWorkItem. QueueUserWorkItem si aspetta tipo WaitCallback quindi in questo caso o dovrebbe essere di tipo oggetto perché WaitCallback è delegato per i metodi con un parametro di tipo oggetto che restituisce void.

Come per lo che significa di questo particolare frammento di codice; in pratica aggiungi una funzione (elemento di lavoro) a una coda che verrà eseguita da uno dei thread nel pool (quando sarà disponibile). Quel particolare frammento di codice descrive solo un modo carino e succinto di passare la funzione senza dover passare attraverso il problema di definire completamente un metodo di classe.

Per inciso, io e altri, tendiamo a leggere => come 'tale che'. Alcune persone lo leggono come "va a".

+1

Giusto per chiarire, => è l'operatore e o il parametro che viene passato. Dai un'occhiata a http://msdn.microsoft.com/en-us/library/bb397687.aspx per ulteriori dettagli. – lzcd

+0

@lzcd: non lo chiamerei operatore. È solo la sintassi che separa i parametri dal corpo del lambda. – porges

+1

Se ho capito bene, se voglio passare alcuni parametri alla mia funzione, posso farlo in questo modo: - ThreadPool.QueueUserWorkItem (o => MyFunction (o)); –

2

Sta dichiarando un metodo anonimo. Fondamentalmente, stai passando un metodo il cui corpo è { MyFunction(); } come parametro del metodo QueueUserWorkItem. Non ho controllato, ma dovrebbe anche essere equivalente a:

ThreadPool.QueueUserWorkItem(MyFunction); 
+2

Non proprio non penso. QueueUserWorkItem si aspetta un delegato che accetti un oggetto come argomento; quindi avvolgendo 'MyFunction' in un lambda. – Anthony

3

Questa è la sintassi C# per un'espressione lambda.

E 'per molti versi una definizione di linea delegato. Ti risparmia la tediosità di definire una funzione extra da utilizzare come target delegato.

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

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