Share via


Office 中的執行緒支援

更新:2007 年 11 月

這個主題會提供 Microsoft Office 物件模型 (Object Model) 中如何支援執行緒的相關資訊。雖然 Office 物件模型並非安全執行緒,不過您可以在一個 Office 方案中使用多個執行緒。Office 應用程式就是元件物件模型 (Component Object Model,COM) 伺服器。COM 可讓用戶端在任意執行緒上呼叫 COM 伺服器。若為非安全執行緒的 COM 伺服器,COM 會提供一項序列化並行呼叫的機制,以便隨時只有一個邏輯執行緒會在伺服器上執行。這項機制就稱為單一執行緒 Apartment (STA) 模型。由於呼叫已序列化,因此當伺服器忙碌中或在背景執行緒上處理其他呼叫時,呼叫端可能會被封鎖一段時間。

使用多執行緒時所需知識

若要使用多執行緒,必須至少具備下列與多執行緒處理相關的基本知識:

  • Windows API

  • COM 多執行緒概念

  • 並行

  • 同步處理

  • 封送處理

如需多執行緒處理的一般資訊,請參閱元件中的多執行緒

Office 會在主 STA 中執行。了解這點的含意後,就可以了解如何搭配 Office 使用多個執行緒。

基本多執行緒案例

Visual Studio Tools for Office 程式碼永遠會在 UI 主執行緒上執行。您可能會想要在背景執行緒上另外執行不同的工作,讓應用程式效能流暢進行。目標是幾乎在同時完成兩個工作,而不是一個工作在先,另一個工作在後,以便讓執行更加順暢 (這是使用多執行緒的主要原因)。例如,您或許能以 Excel UI 主執行緒來處理事件,而同時在背景執行緒上執行另一個工作,從伺服器收集資料,並以伺服器的資料更新 Excel UI 中的儲存格。

呼叫 Office 物件模型的背景執行緒

當背景執行緒呼叫 Office 應用程式時,呼叫會自動跨越 STA 界限進行封送處理。不過,不保證 Office 應用程式可以在背景執行緒進行呼叫時處理呼叫。這些可能性包括:

  1. Office 應用程式必須提取訊息,呼叫才有機會進入。如果它正在進行重大的處理,而無法退讓時,就會耗費一些時間。

  2. 如果 Apartment 中已經有另一個邏輯執行緒,新的執行緒便無法進入。通常當邏輯執行緒進入 Office 應用程式,然後對呼叫端的 Apartment 進行重新進入呼叫時,就會發生這種情況。應用程式會被封鎖並等候該呼叫傳回。

  3. Excel 可能處於某種情況,無法立即處理傳入的呼叫。例如,Office 應用程式可能正在顯示強制回應對話方塊。

針對第 2 項和第 3 項可能性,COM 提供了稱為 IMessageFilter 的介面。如果伺服器實作此介面,所有呼叫都會透過稱為 HandleIncomingCall 的方法進入。若為第 2 項可能性,呼叫都會自動遭拒。若為第 3 項可能性,伺服器可能會根據情況,拒絕呼叫。如果呼叫遭拒,呼叫端就必須決定因應措施。通常,呼叫端會實作 IMessageFilter,以便透過 RetryRejectedCall 方法收到拒絕的告知。

不過,在 Visual Studio Tools for Office 的情況中,COM Interop 會將所有遭拒的呼叫轉換成 System.Runtime.InteropServices.COMException (「表示應用程式忙碌中的訊息篩選條件」)。每當您在背景執行緒上進行物件模型呼叫時,就必須準備處理這項例外狀況。通常,處理方式包括重試一段時間,然後顯示對話方塊。不過,您也可將背景執行緒建立為 STA,然後註冊訊息篩選條件,讓該執行緒處理這種情況。

正確啟動執行緒

建立新的 STA 執行緒時,先設定 Apartment 狀態為 STA,再啟動執行緒:

Dim t As New System.Threading.Thread(AddressOf AnObject.aMethod)

t.SetApartmentState(System.Threading.ApartmentState.STA)
t.Start()
System.Threading.Thread t = new System.Threading.Thread(AnObject.aMethod);

t.SetApartmentState(System.Threading.ApartmentState.STA);
t.Start();

如需詳細資訊,請參閱 Managed 執行緒處理的最佳實施方針

非強制回應表單

非強制回應表單允許在顯示表單的同時,與應用程式之間進行某種互動。使用者與表單互動,而表單毋需關閉,即可與應用程式互動。Office 物件模型支援 Managed 非強制回應表單,但是,不應該在背景執行緒上使用。

請參閱

概念

在 Visual Studio 中建立 Office 方案

參考

執行緒 (C# 程式設計手冊)

其他資源

元件中的多執行緒

Managed 執行緒

Visual Basic 中的多執行緒

使用執行緒和執行緒處理