執行緒共用
更新:2007 年 11 月
執行緒共用是一種多執行緒處理的形式,在其中將工作加入佇列並在執行緒建立時自動啟動。使用執行緒共用,您可以利用要執行之程序的委派 (Delegate) 呼叫 ThreadPool.QueueUserWorkItem 方法,然後 Visual Basic 會建立執行緒並執行程序。
執行緒共用範例
下列範例會顯示您要如何使用執行緒共用啟動數個工作。
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
Sub SomeLongTask(ByVal state As Object)
' Insert code to perform a long task.
End Sub
Sub AnotherLongTask(ByVal state As Object)
' Insert code to perform another long task.
End Sub
當您要開啟許多不同的工作,而不要個別設定每一個執行緒的屬性時,執行緒共用便很有用。每一個執行緒會依預設的堆疊大小和優先順序開啟。根據預設,每一個系統處理器最多可以執行 25 個執行緒共用。系統會佇列超過限制的多餘執行緒,但它們在其他執行緒完成之前不會開啟。
執行緒共用的優點之一,是您可以將狀態物件中的引數傳遞至工作程序。如果您正在呼叫的程序需要一個以上的引數,您可將結構或是類別的執行個體轉型成 Object 資料型別。
執行緒共用參數和傳回值
從執行緒共用執行緒傳回值並不簡單。因為 Sub 程序是唯一一種可排入執行緒共用之佇列的程序型別,所以不允許使用自函式呼叫傳回值的標準方式。提供參數和傳回值的其中一個方法是將參數、傳回值和方法包裝成包裝函式類別 (Wrapper Class),如多執行緒程序的參數和傳回值所說明。
有一個較簡單的方法可以提供參數和傳回值,那就是使用 QueueUserWorkItem 方法的選擇性 ByVal 狀態物件變數。如果您使用這個變數將參考傳回類別的執行個體,則執行緒共用執行緒可以修改執行個體的成員,並當做傳回值使用。
起初,藉由傳值傳遞的變數來修改參考的物件可能並不明顯。可以這樣做是因為只有物件參考是藉由傳值傳遞。當您藉由物件參考來改變參考的物件成員時,改變會套用在真正的類別執行個體。
結構無法用來在狀態物件內傳回值。因為結構是實值型別,所以非同步處理序所做的改變不會改變原始結構的成員。不需要傳回值時,請使用結構來提供參數。