Überlegungen zum Threading verwalteter Bibliotheken

Die folgenden Überlegungen zum Tablet-PC-Threading gelten speziell für die verwaltete Bibliothek.

Thread-Safety

Die Verwalteten Bibliotheksklassen der Tablet-PC-Plattform sind im Allgemeinen nicht threadsicher. Die folgenden Auflistungen sind auf Memberebene threadsicher: Diese Auflistungen garantieren jedoch nicht, dass ein Enumerator geschützt ist, wenn ein anderer Thread gleichzeitig für die Auflistung ausgeführt wird:

STA- und MTA-Anwendungen

Verwaltete Anwendungen, die mithilfe der in Microsoft Visual Studio .NET enthaltenen Assistenten erstellt werden, sind standardmäßig Singlethread-Apartment (STA). Sie können das Apartment für Ihre Anwendung ändern, indem Sie das STA-Thread- oder MTA-Threadattribut (Multithreaded Apartment) am Einstiegspunkt Ihrer Anwendung festlegen.

Wenn Ihre Anwendung in einem MTA ausgeführt wird, müssen Sie threadsicheren Code schreiben. Auf diese Weise können Sie jedoch bestimmte Leistungsprobleme bei der Ereignisbehandlung verbessern.

Weitere Informationen zum STA-Thread und zu MTA-Threadattributen finden Sie unter STAThreadAttribute-Klasse und MTAThreadAttribute-Klasse .

Überlegungen zum Windows Forms Threading

Die Steuerelemente InkPicture und InkEdit erweitern Windows Forms Steuerelemente. Windows Forms Steuerelemente verwenden das Sta-Modell (Singlethreaded Apartment), da Windows Forms auf nativen Win32-Fenstern basieren, die inhärent singlethreaded sind. In verwaltetem Code sollten Freihandsteuerelemente im selben Thread wie der Standard Thread für das Formular erstellt werden.

In einer STA-Anwendung treten bestimmte Ereignisse in einem anderen Thread als dem Benutzeroberflächenthread der Anwendung auf. Verwenden Sie beim Aufrufen eines Windows Forms Objekts oder Steuerelements, einschließlich der InkPicture- und InkEdit-Steuerelemente, innerhalb eines Tablet PC-Ereignishandlers die geerbte Control.Invoke-Methode des Objekts oder Steuerelements. Die InvokeRequired-Eigenschaft , die von der Control-Klasse geerbt wird, kann verwendet werden, um zu bestimmen, ob dies erforderlich ist.

Im folgenden Ereignishandler für das Recognition-Ereignis wird beispielsweise die InvokeRequired-Eigenschaft getestet, und bei TRUE wird der Ereignishandler über den Benutzeroberflächenthread erneut aufgerufen.

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

Wenn Sie ein UserControl in einem Browser auf eine Webseite setzen (siehe Websteuerelemente), wird es als STA-Anwendung ausgeführt. Für smarte Clientanwendungen (siehe Keine Touchbereitstellung) hat der Entwickler die vollständige Kontrolle über ApartmentState. (Der Standardwert ist im Allgemeinen STA, kann jedoch MTA sein, abhängig von Ihrer CLR-Version.) Informationen zu Threadingproblemen, die realTimeStylus betreffen, finden Sie unter Threading Considerations for the StylusInput APIs( Überlegungen zum Threading für die StylusInput-APIs).

Weitere Informationen zum Aufrufen Windows Forms aus einer MTA-Anwendung finden Sie unter Multithreaded Windows Forms Control Sample( Beispiel).

Überlegungen zur Zwischenablage

Das Clipboard-Objekt funktioniert nur über einen STA-Thread. Wenn Sie versuchen, aus einem Thread, der nicht STA ist, in die Zwischenablage zu kopieren oder aus der Zwischenablage einzufügen, erhalten Sie eine ThreadStateException. Wenn Ihre Anwendung MTA ist, erstellen Sie einen STA-Thread, um die Methodenaufrufe der Zwischenablage und einige der anderen Ui-Aspekte Ihrer Anwendung zu verarbeiten.

Ausnahmen in Ereignishandlern

Ausnahmen können nicht innerhalb von Tablet PC-Ereignishandlern ausgelöst werden. Wenn beispielsweise ein Ereignishandlerdelegat für ein Tablet PC-Objekt oder eine Tablet PC-Auflistung über drei registrierte Handler verfügt und der erste eine Ausnahme auslöst, tritt die folgende Sequenz auf:

  1. Der erste Handler wird beendet.
  2. Die Ausnahme geht verloren.
  3. Die verbleibenden Handler werden nicht aufgerufen.

Löschen von Objekten und Steuerelementen

Um einen Speicherverlust zu vermeiden, müssen Sie explizit die Dispose-Methode auf jedem Tablet PC-Objekt oder -Steuerelement aufrufen, an das ein Ereignishandler angefügt wurde, bevor das Objekt oder Steuerelement den Gültigkeitsbereich überschreitet.

Um die Leistung in Ihrer Anwendung zu verbessern, löschen Sie manuell jedes Tablet PC-Objekt oder -Steuerelement, das die Dispose-Methode implementiert, wenn das Objekt oder Steuerelement nicht mehr benötigt wird.

StylusInput-APIs

Informationen zu Threadingüberlegungen für das RealTimeStylus-Objekt und die StylusInput-APIs (Application Programming Interfaces) finden Sie unter Überlegungen zum Threading für die StylusInput-APIs.