Office 中的執行緒支援
這個主題會提供 Microsoft Office 物件模型 (Object Model) 中如何支援執行緒的相關資訊。雖然 Office 物件模型並非安全執行緒,不過您可以在一個 Office 方案中使用多個執行緒。Office 應用程式就是元件物件模型 (Component Object Model,COM) 伺服器。COM 可讓用戶端在任意執行緒上呼叫 COM 伺服器。若為非安全執行緒的 COM 伺服器,COM 會提供一項序列化並行呼叫的機制,以便隨時只有一個邏輯執行緒會在伺服器上執行。這項機制就稱為單一執行緒 Apartment (STA) 模型。由於呼叫已序列化,因此當伺服器忙碌中或在背景執行緒上處理其他呼叫時,呼叫端可能會被封鎖一段時間。
**適用於:**本主題中的資訊適用於 Office 2013 和 Office 2010 的文件層級專案和應用程式層級專案。如需詳細資訊,請參閱依 Office 應用程式和專案類型提供的功能。
使用多執行緒時所需知識
若要使用多執行緒,必須至少具備下列與多執行緒處理相關的基本知識:
Windows API
COM 多執行緒概念
並行
同步處理
封送處理
如需多執行緒處理的一般資訊,請參閱元件中的多執行緒。
Office 會在主 STA 中執行。了解這點的含意後,就可以了解如何搭配 Office 使用多個執行緒。
基本多執行緒案例
Office 方案中的程式碼永遠會在 UI 主執行緒上執行。您可能會想要在背景執行緒上另外執行不同的工作,讓應用程式效能流暢進行。目標是幾乎在同時完成兩個工作,而不是一個工作在先,另一個工作在後,以便讓執行更加順暢 (這是使用多執行緒的主要原因)。例如,您或許能以 Excel UI 主執行緒來處理事件,而同時在背景執行緒上執行另一個工作,從伺服器收集資料,並以伺服器的資料更新 Excel UI 中的儲存格。
呼叫 Office 物件模型的背景執行緒
當背景執行緒呼叫 Office 應用程式時,呼叫會自動跨越 STA 界限進行封送處理。不過,不保證 Office 應用程式可以在背景執行緒進行呼叫時處理呼叫。這些可能性包括:
Office 應用程式必須提取訊息,呼叫才有機會進入。如果它正在進行重大的處理,而無法退讓時,就會耗費一些時間。
如果 Apartment 中已經有另一個邏輯執行緒,新的執行緒便無法進入。通常當邏輯執行緒進入 Office 應用程式,然後對呼叫端的 Apartment 進行重新進入呼叫時,就會發生這種情況。應用程式會被封鎖並等候該呼叫傳回。
Excel 可能處於某種情況,無法立即處理傳入的呼叫。例如,Office 應用程式可能正在顯示強制回應對話方塊。
針對第 2 項和第 3 項可能性,COM 提供了 IMessageFilter 介面。如果伺服器實作此介面,所有呼叫都會透過 HandleIncomingCall 方法進入。若為第 2 項可能性,呼叫都會自動遭拒。若為第 3 項可能性,伺服器可能會根據情況,拒絕呼叫。如果呼叫遭拒,呼叫端就必須決定因應措施。通常,呼叫端會實作 IMessageFilter,以便透過 RetryRejectedCall 方法收到拒絕通知。
不過,如果方案是以 Visual Studio 中的 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 非強制回應表單,但是,不應該在背景執行緒上使用。