2013-04-27 78 views
0

有沒有區別我需要有效的(使用最少的線程可能)異步的計算方式(我使用.net 4)。 一種方式是ThreadPool.QueueUserWorkItem和委託BeginInvoke

ThreadPool.QueueUserWorkItem(f => job.DoWork()); 
job.Completed += (a, b) => {...} //Completed is event I fire when work is done 

另一種可能性是執行異步方法作爲先於C#5節,這基本上是一個代表主叫BeginInvokedone

我的問題是:除了不同的語法之外,這兩者之間是否有區別,因爲它似乎BeginInvoke也使用ThreadPool的新線程?

另一方面:是否有可能在與調用方相同的線程上定義和調用方法(如在javascript中所做的)(在任何C#版本中)?

回答

1

Delegate.BeginInvoke將該方法放在ThreadPool處。 BeginInvoke的優點是您可以使用IAsyncResult,它可用於監視異步調用的進度。它的'兄弟'方法EndInvoke檢索異步調用的結果。它可以在BeginInvoke之後隨時調用。如果異步調用尚未完成,則EndInvoke會阻止調用線程,直到完成。

請參見:http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx

2

沒有比推薦您閱讀Joseph Albahari的(部分免費)關於Threading in C#的書更好的答案。

Asynchronous delegates

ThreadPool.QueueUserWorkItem不適合 得到的返回值提供了一個簡單的機制從一個線程回來,它已經完成 執行之後。異步委託調用(異步委託爲 )解決這個問題,允許在兩個方向上傳遞任意數量的類型化參數爲 。此外, 異步委託的未處理異常在原始 線程(或更準確地說,調用EndInvoke的線程)上方便地重新生成,因此它們不需要顯式處理。

2

我會看看的Task Parallel LibraryTask class。任務並行庫(TPL)提供循環的並行執行,並且Task類允許您控制任務應執行的線程,這對於UI操作很重要。