Überlegungen zum Threading verwalteter Bibliotheken
Die folgenden Überlegungen zum Tablet PC-Threading gelten speziell für die verwaltete Bibliothek.
- Threadsicherheit
- STA- und MTA-Anwendungen
- Windows Überlegungen zum Threading von Formularen
- Überlegungen zur Zwischenablage
- Ausnahmen in Ereignishandlern
- Entfernen von Objekten und Steuerelementen
- StylusInput-APIs
Thread-Safety
Die verwalteten Bibliotheksklassen der Tablet PC-Plattform sind im Allgemeinen nicht threadsicher. Die folgenden Auflistungen sind threadsicher auf Memberebene. Diese Auflistungen garantieren jedoch nicht, dass ein Enumerator geschützt ist, wenn ein anderer Thread gleichzeitig mit der Auflistung arbeitet:
STA- und MTA-Anwendungen
Verwaltete Anwendungen, die mithilfe der in Microsoft Visual Studio .NET enthaltenen Assistenten erstellt wurden, sind standardmäßig Singlethread-Apartment (STA). Sie können das Apartment für Ihre Anwendung ändern, indem Sie den STA-Thread oder das MTA-Threadattribut (Multithreaded Apartment) auf dem 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 den MTA-Threadattributen finden Sie unter STAThreadAttribute-Klasse und MTAThreadAttribute-Klasse.
Windows Überlegungen zum Threading von Formularen
Die Steuerelemente InkPicture und InkEdit erweitern Windows Forms-Steuerelemente. Windows Formularsteuerelemente verwenden das Sta-Modell (Singlethread-Apartment), da Windows Forms auf nativen Win32-Fenstern basieren, die grundsätzlich singlethreaded sind. In verwaltetem Code sollten Ink-Steuerelemente im gleichen Thread wie der Hauptthread für das Formular erstellt werden.
In einer STA-Anwendung werden bestimmte Ereignisse in einem anderen Thread als dem Benutzeroberflächenthread der Anwendung ausgeführt. Verwenden Sie beim Aufrufen eines Windows Forms-Objekts oder -Steuerelements, einschließlich der Steuerelemente InkPicture und InkEdit, innerhalb eines Tablet PC-Ereignishandlers die geerbte Control.Invoke-Methode des Objekts oder Steuerelements. Die InvokeRequired-Eigenschaft, die von der Control-Klasse geerbt wurde, 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-Steuerelement in einem Browser auf einerWebseite speichern (siehe Websteuerelemente),wird es als STA-Anwendung ausgeführt. Für intelligente Clientanwendungen (siehe No Touch Deployment) hat der Entwickler die vollständige Kontrolle über ApartmentState. (Der Standardwert ist in der Regel STA, kann aber je nach CLR-Version MTA sein.) Informationen zu Threadingproblemen im Zusammenhang mit dem RealTimeStylusfinden Sie unter Überlegungen zum Threading für die StylusInput-APIs.
Weitere Informationen zum Aufrufen von Windows Forms aus einer MTA-Anwendung finden Sie unter Beispiel für multithreaded Windows Forms-Steuerelement.
Überlegungen zur Zwischenablage
Das Zwischenablageobjekt funktioniert nur über einen STA-Thread. Wenn Sie versuchen, aus einem Thread, der nicht STA ist, in die Zwischenablage zu kopieren oder aus ihr zu kopieren, erhalten Sie eine ThreadStateException. Wenn Ihre Anwendung MTA ist, erstellen Sie einen STA-Thread, um die Methodenaufrufe der Zwischenablage und einige der anderen Aspekte der Benutzeroberfläche Ihrer Anwendung zu verarbeiten.
Ausnahmen in Ereignishandlern
Ausnahmen können nicht innerhalb von Tablet PC-Ereignishandlern ausgelöst werden. Wenn beispielsweise ein Ereignishandler-Delegat für ein Tablet PC-Objekt oder eine Tablet PC-Sammlung über drei registrierte Handler verfügt und der erste handler eine Ausnahme auslöst, tritt die folgende Sequenz auf:
- Der erste Handler wird beendet.
- Die Ausnahme geht verloren.
- Die verbleibenden Handler werden nicht aufgerufen.
Entfernen von Objekten und Steuerelementen
Um einen Speicherverlust zu vermeiden, müssen Sie die Dispose-Methode explizit für jedes Tablet PC-Objekt oder -Steuerelement aufrufen, an das ein Ereignishandler angefügt wurde, bevor das Objekt oder Steuerelement den Gültigkeitsbereich übergeht.
Um die Leistung in Ihrer Anwendung zu verbessern, löschen Sie jedes Tablet PC-Objekt oder -Steuerelement manuell, 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 Anwendungsprogrammierschnittstellen (APIs) von StylusInput finden Sie unter Überlegungen zum Threading für die StylusInput-APIs.