2012-06-04 58 views
0

有人可以解釋一下這段代碼給我一點,所以我有一個更確切地瞭解到底發生了什麼?TaskWrapper - 線程和委託混淆

taskWrapper = XTThreadPool.DEFAULT_POOL.Run((System.Threading.ThreadStart)delegate() 
{ 
    //Remote procedure execution and result processing code. 
    //Some vars set in here are used after the Join() below. 
}, true, true); 

while (taskWrapper.Status == XTThreadPool.Task.STATUS.None) 
{ 
    System.Threading.Thread.Sleep(10); 
} 

... 

taskWrapper.Join(); 

它看起來像我正在創建一個單獨的線程,並在其中使用遠程過程調用。儘管我對使用委託或者taskWrapper對象創建的語法有點朦朧。

回答

1

那麼它不知道什麼是在XTThreadPool類有點棘手,但你可以有一個猜測...

的機會,這第一位......

taskWrapper = XTThreadPool.DEFAULT_POOL.Run((System.Threading.ThreadStart)delegate() 
{ 
    //Remote procedure execution and result processing code. 
    //Some vars set in here are used after the Join() below. 
}, true, true); 

...啓動異步運行的線程,並傳遞放置註釋的部分中指定的方法。這可能是通過創建一個Thread實例作爲委託給它的構造函數並調用newThread.Start()來實現的,該實例在應用程序的線程池內的新線程上開始執行。然後,參考線可以用來檢查線程的狀態,看看它的完成與否,這可能是這部分做什麼:

while (taskWrapper.Status == XTThreadPool.Task.STATUS.None) 
{ 
    System.Threading.Thread.Sleep(10); 
} 

這似乎有點怪我。 System.Threading.Thread訪問當前線程,而不是由線程池啓動的線程,而Sleep方法僅表示「無所事事」。所以當前線程正在等待taskWrapper實例啓動的線程進入非None狀態。現在這是困難的地方,因爲我們不知道taskWrapper在做什麼。

實際上它可能只是等待線程完成執行,但那麼就沒有一個單獨的線程有任何意義,因爲工作也可以在上面的while循環中完成。

然後將此:

taskWrapper.Join(); 

線上面可以做任何事情,就像我說的這取決於什麼的taskWrapper是落實。但根據名字我猜想它使用Thread.Join方法,這基本上導致調用線程(此線程)等待,直到它調用的線程(taskWrapper)完成。然而,taskWrapper本身實際上並不是一個線程(基於對上面Status屬性值的檢查),更可能它只是線程的一個包裝。

我完全猜測這是誠實的,它真的可以做任何事情。在沒有看到XTThreadPool類的代碼的情況下,無論DEFAULT_POOL是否是實例,都無法確切知道發生了什麼。

在第一次檢查時,if該代碼正在做我以上猜測的結果,沒有意義讓另一個線程來完成這項工作,沒有任何一點有while循環!整個事情可以用Run中調用的方法中的任何東西來代替。

+0

也只是猜測在這裏,但等待狀態不是'無'可能意味着等待,直到任務實際開始(即它已被安排到一個底層線程)。 –

+0

非常感謝您的幫助:)我相信你是對的,這可能是在原始線程中完成的。 +1 :) –