共用方式為


管理程式庫執行緒考量

下列平板電腦的執行緒考量是受控程式庫所特有的。

Thread-Safety

平板電腦平台的受控庫類別通常不是執行緒安全的。 下列集合在成員層級具有線程安全;不過,如果另一個線程同時在集合上運作,這些集合並不保證列舉值受到保護:

STA 和 MTA 應用程式

使用 Microsoft Visual Studio .NET 所包含精靈所建立的受控應用程式預設為單個線程 Apartment (STA)。 您可以在應用程式的進入點上設定 STA 線程或多線程 Apartment (MTA) 線程屬性,以變更應用程式的 Apartment。

如果您的應用程式在 MTA 中執行,您必須撰寫安全線程的程式代碼;不過,您可以藉由這麼做來改善特定事件處理效能問題。

如需 STA 線程和 MTA 線程屬性的詳細資訊,請參閱 STAThreadAttribute 類別和 MTAThreadAttribute 類別。

Windows Forms 線程考慮

InkPictureInkEdit 控件會擴充 Windows Forms 控件。 Windows Forms 控件使用單個線程 Apartment (STA) 模型,因為 Windows Forms 是以原本為單個線程的原生 Win32 視窗為基礎。 在 Managed 程式代碼中,筆跡控制項應該在與表單主執行緒相同的執行緒中建立。

在 STA 應用程式中,某些事件發生在應用程式使用者介面 (UI) 線程以外的線程上。 從 Tablet PC 事件處理程式內呼叫任何 Windows Forms 物件或控件,包括 InkPictureInkEdit 控件時,請使用物件或控件的繼承 Control.Invoke 方法。 InvokeRequired 屬性繼承自 Control 類別,可用來判斷這是否必要。

例如,在下列 辨識 事件的事件處理程式中,會測試 InvokeRequired 屬性,如果 TRUE,則會從使用者介面線程重新叫用事件處理程式。

void recoContext_Recognition(object sender, 
        RecognizerContextRecognitionEventArgs e)
{
    if (InvokeRequired)
    {
        Invoke( new RecognizerContextRecognitionEventHandler(  
                     recoContext_Recognition ),
                    new object[] { sender, e } );
        return;
    }
     // Use the recognition result here.
}

如果您將 UserControl 放在瀏覽器中的 awebpage 上(請參閱 Web Controls),則會以 STA 應用程式的形式執行。 針對智慧型用戶端應用程式(請參閱 No Touch Deployment),開發人員已完全控制 ApartmentState。 (預設值通常是 STA,但可能是 MTA,視您的 CLR 版本而定。如需有關 RealTimeStylus的執行緒問題,請參閱 StylusInput API的執行緒考慮。

如需從 MTA 應用程式呼叫 Windows Forms 的詳細資訊,請參閱 多線程 Windows Forms 控制件範例

剪貼簿考慮事項

剪貼簿 物件只能在 STA 執行緒中運作。 嘗試從非 STA 的線程複製或貼上剪貼簿時,您會取得 ThreadStateException。 如果您的應用程式是 MTA,請建立 STA 線程來處理剪貼簿的方法呼叫,以及應用程式的一些其他 UI 層面。

事件處理程式內的例外狀況

無法在平板電腦事件處理程式中拋出例外。 例如,如果 Tablet PC 物件或集合的事件處理程式委派有三個已註冊的處理程式,而第一個處理程式擲回例外狀況,則會發生下列順序:

  1. 第一個處理程式會結束。
  2. 例外狀況遺失了。
  3. 不會叫用其餘的處理程式。

處置物件和控件

為了避免記憶體洩漏,您必須在任何附加了事件處理程式的 Tablet PC 物件或控件即將超出範圍之前,明確呼叫 Dispose 方法。

若要改善應用程式中的效能,請在不再需要物件或控件時,手動處置任何實作 Dispose 方法的 Tablet PC 物件或控件。

觸控筆輸入 API

如需 RealTimeStylus 物件和 StylusInput 應用程式開發介面線程考慮的相關信息,請參閱 StylusInput API 線程考慮