如何:管理執行緒的控制項

BackgroundWorker 元件會取代並加入功能至 BeginInvoke 方法;不過,您可以選擇保留 BeginInvoke 方法,這樣不僅可以提供回溯相容性 (Backward Compatibility),未來也能適用。 如需詳細資訊,請參閱 BackgroundWorker 元件概觀

多執行緒最適合用來執行類別模組中需要大量處理器資源的程序。 與其他元件不同的是,從個別執行緒直接呼叫控制項中的方法會發生問題。 影響控制項的方法應只在建立控制項所在的執行緒上執行。 由於封送處理來自於一執行緒的呼叫並將其跨執行緒界線傳送至另一執行緒會耗用大量系統資源,因此您應避免重複呼叫其他執行緒上的控制項。 最佳的情況是,來自其他執行緒的直接呼叫耗用大量資源,而您應用程式的效能因此降低。 最糟的情況是可能會在您的應用程式中發生一些造成死結 (Deadlock) 的狀況,因而凍結執行。

不過在一些情況下,您可能要從執行緒呼叫控制項的方法。 例如,您可能會呼叫停用按鈕或更新表單上顯示的方法來回應任一執行緒採取的動作。 .NET Framework 提供能夠安全地從任何執行緒呼叫的方法,以便叫用與其他執行緒擁有的控制項互動的方法。 Invoke 方法允許同步執行控制項上的方法,而 BeginInvoke 方法則會啟動非同步執行。 若要使用這些方法,您必須利用與您將叫用方法相同的簽章來宣告委派。 接著,提供要呼叫方法的適當委派,就可呼叫表單上任何控制項的 InvokeBeginInvoke 方法。 任何必要參數都會包裝在 Object 中並傳輸至方法。

若要叫用與其他執行緒所擁有控制項相關的方法

  1. 利用與您要叫用方法相同的簽章來宣告委派。

    以下範例將說明如何宣告具有 Integer 和 String 參數的委派。

    Public Delegate Sub myDelegate(ByVal anInteger as Integer, ByVal _
       aString as String)
    
    public delegate void myDelegate(int anInteger, string aString);
    
  2. 使用任何控制項來叫用操作其他執行緒所擁有控制項的方法。

    注意事項注意事項

    方法所需參數 (若有的話) 可在 Object 內提供。

    • 如果您要同步叫用方法,請呼叫 Control.Invoke 方法

      Label1.Invoke(New myDelegate(AddressOf myMethod), New _
         Object() {1, "This is the string"})
      
      Label1.Invoke(new myDelegate(myMethod), new Object[] {1,
         "This is the string"});
      
    • 如果您要非同步叫用方法,請呼叫 Control.BeginInvoke 方法

      Label1.BeginInvoke(New myDelegate(AddressOf myMethod), _
         New Object() {1, "This is the string"})
      
      Label1.BeginInvoke(new myDelegate(myMethod), new 
      Object[] {1, "This is the string"});
      

請參閱

工作

逐步解說:使用 Visual Basic 撰寫簡單的多執行緒元件

逐步解說:使用 Visual C# 撰寫簡單的多執行緒元件

參考

BackgroundWorker

概念

事件架構非同步模式概觀

其他資源

元件中的多執行緒