2012-07-25 48 views
1

我想了解ThreadPool.QueueWorkItem方法如何工作。但無法理解它是如何工作的。ThreadPool上的方法如何排隊

我創建了一個簡單的例子來測試ThreadPool,當我運行此代碼時,它快速循環並停在Thread.Sleep()行。那麼ThreadPool在這裏做了什麼。它是否將10000方法存儲在內部集合中,然後以異步方式執行它們。 (根據一些計算內部線程數可以是任何東西=>這是我所知道的)

  1. 如果有一個隊列(應該),我可以得到的物品(方法)計數正在等待在隊列上?

2.In例如WriteLine方法很簡單,但我真正appllication我遍歷50000項,並調用Web服務方法,數據庫選擇/插入/更新VB。對於數組中的每個項目。是否有可能做這種類型的事情?

class Program 
{ 
    static void Main(string[] args) 
    { 
     new Program().Looper(); 
    } 

    public void Looper() 
    { 
     for (int i = 0; i < 10000; i++) 
     { 
      ThreadPool.QueueUserWorkItem(WriteLine, i); 
     } 

     Thread.Sleep(10000); 
    } 

    public void WriteLine(object str) 
    { 
     Debug.WriteLine((int)str); 
    } 
} 
+0

你是怎麼得到一組50k方法的? – 2012-07-25 18:19:20

+0

我從來沒有用真正的方法體來測試它 – Yucel 2012-07-25 18:22:59

回答

2

1)如果有一個隊列(應該是),我可以得到正在等待隊列的項目(方法)的計數嗎?

是的,有一個隊列,沒有你看不到它。它是ThreadPool的一個實現細節,無論如何你都無法真正做到。

2.In例如WriteLine方法很簡單,但我真正appllication我遍歷50000項,並調用Web服務方法,數據庫選擇/插入/更新VB。對於數組中的每個項目。是否有可能做這種類型的事情?

是的,它聽起來像它可能是一個很好的候選人集中執行,因爲它涉及到大量的等待外部資源。也就是說,如果您使用的是.NET 4.0或更高版本,則可能需要查看TPL而不是自己訪問線程池。 TPL爲您提供了任務嵌套和延續等功能,這些功能並不是使用ThreadPool獲得的。它本身也與異步模式集成,爲您提供改進的異步I/O並行性。

0

當你排隊的項目,增加一個int計數器,那麼當流程執行完畢(我相信你可以有一個功能 - 委託異步過程完成時執行),然後遞減在於誠信櫃檯和應該給你等待執行的線程數量。 Thread.Sleep不會存儲任何內容,它只是暫停進入該異步進程的進一步進程。