Condividi tramite


Considerazioni sul threading della libreria gestita

Le seguenti considerazioni sul threading tablet PC sono specifiche della libreria gestita.

Thread-Safety

Le classi della libreria gestita della piattaforma Tablet PC non sono in genere thread-safe. Le raccolte seguenti sono thread-safe a livello di membro; tuttavia, queste raccolte non garantiscono che un enumeratore sia protetto se un altro thread opera contemporaneamente nella raccolta:

Applicazioni STA e MTA

Le applicazioni gestite create usando le procedure guidate contenute in Microsoft Visual Studio .NET sono appartamento a thread singolo (STA) per impostazione predefinita. È possibile modificare l'appartamento per l'applicazione impostando l'attributo thread STA o multithreaded apartment (MTA) nel punto di ingresso dell'applicazione.

Se l'applicazione viene eseguita in un MTA, è necessario scrivere codice thread-safe; tuttavia, in questo modo è possibile migliorare determinati problemi di prestazioni di gestione degli eventi.

Per altre informazioni sugli attributi del thread STA e del thread MTA, vedere classe STAThreadAttribute e classe MTAThreadAttribute .

considerazioni sul threading Windows Forms

I controlli InkPicture e InkEdit estendono i controlli Windows Forms. Windows Forms controlli usano il modello a thread singolo (STA) perché Windows Forms si basano su finestre Win32 native che sono intrinsecamente a thread singolo. Nel codice gestito, i controlli input penna devono essere creati nello stesso thread del thread principale per il modulo.

In un'applicazione STA, alcuni eventi si verificano in un thread diverso dal thread dell'interfaccia utente dell'applicazione. Quando si chiama qualsiasi oggetto o controllo Windows Forms, inclusi i controlli InkPicture e InkEdit, dall'interno di un gestore eventi tablet PC, usare il metodo Control.Invoke ereditato dall'oggetto o dal controllo. La proprietà InvokeRequired , ereditata dalla classe Control, può essere usata per determinare se è necessario.

Ad esempio, nel gestore eventi seguente per l'evento Recognition , la proprietà InvokeRequired viene testata e, se TRUE, il gestore eventi viene richiamato nuovamente dal thread dell'interfaccia utente.

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

Se si inserisce UserControl in un browser (vedere Controlli Web), viene eseguito come applicazione STA. Per le applicazioni client intelligenti (vedere No Touch Deployment), lo sviluppatore ha il controllo completo su ApartmentState. Il valore predefinito è in genere STA, ma può essere MTA, a seconda della versione di CLR. Per i problemi di threading che coinvolgono RealTimeStylus, vedere Considerazioni di threading per le API StylusInput.

Per altre informazioni sulla chiamata Windows Forms da un'applicazione MTA, vedere Esempio di controllo multithreaded Windows Forms.

Considerazioni sugli Appunti

L'oggetto Appunti funziona solo da un thread STA. Quando si tenta di copiare o incollare dagli Appunti da un thread che non è STA, si ottiene un thread ThreadStateException. Se l'applicazione è MTA, creare un thread STA per gestire le chiamate al metodo degli Appunti e alcuni degli altri aspetti dell'interfaccia utente dell'applicazione.

Eccezioni all'interno dei gestori eventi

Non è possibile generare eccezioni dall'interno dei gestori eventi tablet PC. Ad esempio, se un delegato del gestore eventi per un oggetto Tablet PC o una raccolta ha tre gestori registrati e il primo genera un'eccezione, si verifica la sequenza seguente:

  1. Il primo gestore viene chiuso.
  2. L'eccezione viene persa.
  3. I gestori rimanenti non vengono richiamati.

Eliminazione di oggetti e controlli

Per evitare una perdita di memoria, è necessario chiamare in modo esplicito il metodo Dispose in qualsiasi oggetto PC tablet o controllo a cui è stato collegato un gestore eventi prima che l'oggetto o il controllo esce dall'ambito.

Per migliorare le prestazioni nell'applicazione, eliminare manualmente qualsiasi oggetto o controllo Tablet PC che implementa il metodo Dispose quando l'oggetto o il controllo non sono più necessari.

API StylusInput

Per informazioni sulle considerazioni sul threading per l'oggetto RealTimeStylus e le interfacce di programmazione dell'applicazione StylusInput (API) vedere Considerazioni di threading per le API StylusInput.