2009-09-24 37 views
0

當我實現WaitCallback和QueueUserWorkItem

WaitCallback waitCB = new WaitCallback(DisplayTime); 
for (int i = 1; i <= 5; i++) 
{ 
    ThreadPool.QueueUserWorkItem(waitCB, null); 
    Thread.Sleep(2000); 
} 


    public void DisplayTime(object state) 
    { 
     Console.WriteLine("Current Time {0} ", DateTime.Now); 
    } 

(1)這是否意味着,我的工作是排隊進入到CLR?

(2)CLR在完成隊列中現有的待處理項目之後是否會處理它?

(3)在隊列中處理我的物品的時間不可預測嗎?

回答

3

(1)這是否意味着我的工作排隊等候到CLR?

它排隊以儘快從池中線程可用

(2)的過程CLR它在隊列整理現有未決項後處理?

有可能在同一時間執行......只要池中的線程中的一個可用的,它是用來從隊列處理下一個項目的多個工作

(3)在隊列中處理我的物品的時間是否不可預測?

不,至少不是很容易......你必須知道排隊作業需要多長時間才能執行,並跟蹤每個作業以計算給定作業的執行時間。爲什麼你想知道呢?

+0

我的懷疑與(3)有關,CLR處理我的物品的時間是不可預測的; CLR的服務對我的物品的服務是否不確定? – user160677 2009-09-24 13:06:26

+0

不,這不是確定性的。 CLR無法知道下一個池線程何時可用 – 2009-09-24 13:18:32

2

您的回調將在線程池線程上執行,具體取決於CLR使用哪種算法從其池中分配和啓動線程。

在你的例子中,回調將被立即以一種看似確定的方式進行處理。但是,根據線程池的狀態,這可能很容易改變。如果你的進程已經用完了池中的所有線程,那麼你的回調將不會被執行,直到一個線程在別的地方完成並且可用。

相關問題