2010-06-28 40 views
6

我使用線程池與follwoing代碼: -什麼是=>運營商在此代碼

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

我不知道什麼呢o=>確實在這段代碼。誰能幫我嗎。

+0

我想你的意思'()=> MyFunction的()',這是不帶參數的拉姆達 – 2010-06-28 05:33:57

+0

@Mystere人QueueUserWorkItem預計WaitCallback的實例,這對於拍攝和對象,並返回void的方法的委託。所以,雖然很奇怪,但簽名是正確的。 – 2010-06-28 05:39:28

回答

11

它描述了一個lambda(匿名)函數。在這種情況下,它是一個函數,它接受一個參數o,然後執行MyFunction(儘管在這種情況下它基本上拋出o的值)。它相當於:

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

o的類型根據QueueUserWorkItem的期望推斷出來。 QueueUserWorkItem需要類型WaitCallback,所以在這種情況下,o應該是類型對象,因爲WaitCallback委託給一個帶有一個返回void類型對象的參數的方法。

至於該特定代碼片段的含義;你基本上將一個函數(工作項)添加到將由池中的一個線程執行的隊列中(當它變得可用時)。該特定的代碼片段只是描述了傳遞函數的一個很好的簡潔方法,而不必經歷完全定義類方法的麻煩。

順便說一句,我和其他人傾向於讀= ='這樣'。有些人認爲這是'走向'。

+1

爲了澄清,=>是運算符,o是傳入的參數。有關詳細信息,請訪問http://msdn.microsoft.com/en-us/library/bb397687.aspx。 – lzcd 2010-06-28 05:04:44

+0

@lzcd:我不會稱之爲操作員。這只是將參數從lambda主體中分離出來的語法。 – porges 2010-06-28 05:33:49

+1

如果我理解正確的話,如果我想傳遞一些參數到我的函數,那麼我可以這樣做: - ThreadPool.QueueUserWorkItem(o => MyFunction(o)); – 2010-06-28 06:03:35

2

它聲明瞭一個匿名方法。基本上,您傳遞的方法的主體是{ MyFunction(); }作爲QueueUserWorkItem方法的參數。我沒有檢查過,但它也應該等於:

ThreadPool.QueueUserWorkItem(MyFunction); 
+2

不完全我不認爲。 QueueUserWorkItem需要一個接受一個對象作爲參數的委託;因此將'MyFunction'封裝在lambda中。 – Anthony 2010-06-28 05:03:37

3

這是lambda表達式的C#語法。

它在許多方面是一個內聯委託定義。它可以節省您定義額外功能以作爲委託目標的繁瑣工作。

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

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