2010-06-28 11 views
6

I Threadpool mit dem follwoing Code verwenden: -Was ist Operator => in diesem Code

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

Ich bin nicht sicher, was tut o=> in diesem Code tut. Kann mir jemand helfen?

+0

Ich denke du meinst '() => MyFunction()', das ist ein Lambda ohne Parameter –

+0

@Mystere Man QueueUserWorkItem eine Instanz von WaitCallback erwartet, die ein Delegierter für Methoden, die nehmen und Objekt und leer kommen . Also, während seltsam, ist die Signatur korrekt. –

Antwort

11

Es beschreibt eine Lambda (anonyme) Funktion. In diesem Fall ist es eine Funktion, die ein Argument, o, annimmt und dann MyFunction ausführt (obwohl sie in diesem Fall im Grunde genommen den Wert o wegwirft). Es ist äquivalent zu:

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)); 

Die Art der o abgeleitet basiert auf, was QueueUserWorkItem erwartet. QueueUserWorkItem erwartet den Typ WaitCallback. In diesem Fall sollte o vom Typ object sein, da WaitCallback ein Delegate für Methoden mit einem Parameter vom Typ object ist, der void zurückgibt.

Wie für die Bedeutung von diesem bestimmten Code-Fragment; Sie fügen einer Warteschlange im Grunde eine Funktion (Arbeitsaufgabe) hinzu, die von einem der Threads im Pool ausgeführt wird (wenn sie verfügbar wird). Dieses spezielle Codefragment beschreibt nur eine schöne, prägnante Art, die Funktion zu übergeben, ohne sich die Mühe machen zu müssen, eine Klassenmethode vollständig zu definieren.

Übrigens, ich und andere neigen dazu zu lesen => wie 'so dass'. Manche Leute lesen es als "geht zu".

+1

Nur um zu klären, => ist der Operator und o ist der Parameter, der übergeben wird. Werfen Sie einen Blick auf http://msdn.microsoft.com/en-us/library/bb397687.aspx für weitere Details. – lzcd

+0

@lzcd: Ich würde es nicht als Operator bezeichnen. Es ist nur die Syntax, die die Parameter vom Körper des Lambda trennt. – porges

+1

Wenn ich richtig verstehe, wenn ich einige Parameter an meine Funktion dann übergeben möchte, kann ich es so machen: - ThreadPool.QueueUserWorkItem (o => MyFunction (o)); –

2

Es wird eine anonyme Methode deklariert. Im Grunde übergeben Sie eine Methode mit dem Text { MyFunction(); } als Parameter an die QueueUserWorkItem-Methode. Ich habe nicht überprüft, aber es sollte auch gleichwertig sein mit:

ThreadPool.QueueUserWorkItem(MyFunction); 
+2

Nicht ganz ich denke nicht. QueueUserWorkItem erwartet einen Delegaten, der ein Objekt als Argument akzeptiert. daher Wrapping 'MyFunction' in einem Lambda. – Anthony

3

Dies ist die C# -Syntax für einen Lambda-Ausdruck.

Es ist in vielerlei Hinsicht Definition eine Inline-Delegierter. Es erspart Ihnen die mühsame Definition einer zusätzlichen Funktion, die als Delegatziel verwendet werden soll.

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

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