執行緒集區 (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)

參考

執行緒 (C# 和 Visual Basic)

執行緒同步處理 (C# 和 Visual Basic)

QueueUserWorkItem

System.Threading

ThreadPool

概念

多執行緒應用程式 (C# 和 Visual Basic)

其他資源

HOW TO:使用 Visual C# 將工作項目送出至執行緒集區