執行緒集區 (C# 和 Visual Basic)
「執行緒集區」(Thread Pool) 是執行緒的集合,可以用來執行許多幕後工作 (如需背景的詳細資訊,請參閱執行緒 (C# 和 Visual Basic))。 這讓主要執行緒可以同步處理其他工作。
通常是在伺服器應用程式中採用執行緒集區。每個傳入要求都會指派給執行緒集區中的一個執行緒,因此可以同步處理要求,而不用中斷主要執行緒或延遲後續要求的處理。
一旦集區中的執行緒完成工作,就會回到等待中執行緒的佇列,執行緒可以在這裡被重複使用。重覆使用可讓應用程式省去為每個工作建立新執行緒的成本。
執行緒集區通常有執行緒的數目上限。如果所有的執行緒都在忙碌中,多出來的工作會放置在佇列中,直到執行緒可提供服務為止。
您可以實作自己的執行緒集區,但是使用透過 ThreadPool 類別由 .NET Framework 提供的執行緒集區,會容易多了。
使用執行緒共用,您可以利用要執行之程序的委派呼叫 ThreadPool.QueueUserWorkItem 方法,然後 Visual Basic 或 C# 會建立執行緒並執行程序。
執行緒共用範例
下列範例會顯示您要如何使用執行緒共用啟動數個工作。
Public Sub DoWork()
' Queue a task.
System.Threading.ThreadPool.QueueUserWorkItem(
New System.Threading.WaitCallback(AddressOf SomeLongTask))
' Queue another task.
System.Threading.ThreadPool.QueueUserWorkItem(
New System.Threading.WaitCallback(AddressOf AnotherLongTask))
End Sub
Private Sub SomeLongTask(ByVal state As Object)
' Insert code to perform a long task.
End Sub
Private Sub AnotherLongTask(ByVal state As Object)
' Insert code to perform another long task.
End Sub
public void DoWork()
{
// Queue a task.
System.Threading.ThreadPool.QueueUserWorkItem(
new System.Threading.WaitCallback(SomeLongTask));
// Queue another task.
System.Threading.ThreadPool.QueueUserWorkItem(
new System.Threading.WaitCallback(AnotherLongTask));
}
private void SomeLongTask(Object state)
{
// Insert code to perform a long task.
}
private void AnotherLongTask(Object state)
{
// Insert code to perform a long task.
}
執行緒共用的優點之一,是您可以將狀態物件中的引數傳遞至工作程序。如果您正在呼叫的程序需要一個以上的引數,您可將結構或是類別的執行個體轉型成 Object 資料型別。
執行緒共用參數和傳回值
從執行緒共用執行緒傳回值並不簡單。因為 Sub 程序是唯一一種可排入執行緒共用之佇列的程序型別,所以不允許使用自函式呼叫傳回值的標準方式。提供參數和傳回值的其中一個方法是將參數、傳回值和方法包裝成包裝函式類別 (Wrapper Class),如多執行緒程序的參數和傳回值 (C# 和 Visual Basic)所說明。
有一個較簡單的方法可以提供參數和傳回值,那就是使用 QueueUserWorkItem 方法的選擇性 ByVal 狀態物件變數。如果您使用這個變數將參考傳回類別的執行個體,則執行緒共用執行緒可以修改執行個體的成員,並當做傳回值使用。
起初,藉由傳值傳遞的變數來修改參考的物件可能並不明顯。可以這樣做是因為只有物件參考是藉由傳值傳遞。當您藉由物件參考來改變參考的物件成員時,改變會套用在真正的類別執行個體。
結構無法用來在狀態物件內傳回值。因為結構是實值型別,所以非同步處理序所做的改變不會改變原始結構的成員。不需要傳回值時,請使用結構來提供參數。
請參閱
工作
HOW TO:使用執行緒集區 (C# 和 Visual Basic)