Considerações sobre threading de biblioteca gerenciada
As seguintes considerações de threading do Tablet PC são específicas para a Biblioteca Gerenciada.
- Thread-Safety
- Aplicativos STA e MTA
- Considerações sobre threading do Windows Forms
- Considerações da área de transferência
- Exceções em manipuladores de eventos
- Descartando objetos e controles
- StylusInput APIs
Thread-Safety
As classes da Biblioteca Gerenciada da Plataforma tablet pc geralmente não são thread-safe. As coleções a seguir são thread-safe no nível de membro; no entanto, essas coleções não garantem que um enumerador esteja protegido se outro thread operar na coleção simultaneamente:
Aplicativos STA e MTA
Os aplicativos gerenciados criados usando os assistentes contidos no Microsoft Visual Studio .NET são STA (single-threaded apartment) por padrão. Você pode alterar o apartment para seu aplicativo definindo o thread STA ou o atributo de thread MTA (multithreaded apartment) no ponto de entrada do aplicativo.
Se o aplicativo for executado em um MTA, você deverá escrever um código thread-safe; no entanto, ao fazer isso, você pode melhorar determinados problemas de desempenho de tratamento de eventos.
Para obter mais informações sobre o thread STA e os atributos de thread do MTA, confira Classe STAThreadAttribute e Classe MTAThreadAttribute .
Considerações sobre threading do Windows Forms
Os controles InkPicture e InkEdit estendem Windows Forms controles. Windows Forms controles usam o modelo STA (single-threaded apartment) porque Windows Forms são baseados em janelas nativas do Win32 que são inerentemente threaded único. No código gerenciado, os controles de tinta devem ser criados no mesmo thread que o thread main para o formulário.
Em um aplicativo STA, determinados eventos ocorrem em um thread diferente do thread da interface do usuário do aplicativo. Ao chamar qualquer objeto ou controle Windows Forms, incluindo os controles InkPicture e InkEdit, de dentro de um manipulador de eventos tablet PC, use o método Control.Invoke herdado do objeto ou controle. A propriedade InvokeRequired , herdada da classe Control, pode ser usada para determinar se isso é necessário.
Por exemplo, no manipulador de eventos a seguir para o evento Recognition , a propriedade InvokeRequired é testada e, se TRUE, o manipulador de eventos é invocado novamente do thread da interface do usuário.
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 você colocar um UserControl em uma página web em um navegador (consulte Controles da Web), ele será executado como um aplicativo STA. Para aplicativos cliente inteligentes (consulte No Touch Deployment), o desenvolvedor tem controle total sobre o ApartmentState. (O padrão geralmente é STA, mas pode ser MTA, dependendo da sua versão do CLR.) Para problemas de threading que envolvem o RealTimeStylus, consulte Considerações de threading para as APIs StylusInput.
Para obter mais informações sobre como chamar Windows Forms de um aplicativo MTA, consulte Amostra de controle de Windows Forms multithreaded.
Considerações da área de transferência
O objeto Área de Transferência funciona apenas de um thread STA. Ao tentar copiar ou colar da Área de Transferência de um thread que não é STA, você obtém uma ThreadStateException. Se o aplicativo for MTA, crie um thread STA para lidar com as chamadas de método da Área de Transferência e alguns dos outros aspectos da interface do usuário do aplicativo.
Exceções em manipuladores de eventos
Exceções não podem ser geradas de dentro de manipuladores de eventos do Tablet PC. Por exemplo, se um delegado do manipulador de eventos para um objeto ou coleção de tablet pc tiver três manipuladores registrados e o primeiro gerar uma exceção, a seguinte sequência ocorrerá:
- O primeiro manipulador é encerrado.
- A exceção é perdida.
- Os manipuladores restantes não são invocados.
Descartando objetos e controles
Para evitar uma perda de memória, você deve chamar explicitamente o método Dispose em qualquer objeto tablet pc ou controle ao qual um manipulador de eventos foi anexado antes que o objeto ou controle saia do escopo.
Para melhorar o desempenho em seu aplicativo, descarte manualmente qualquer objeto ou controle tablet pc que implemente o método Dispose quando o objeto ou controle não for mais necessário.
StylusInput APIs
Para obter informações sobre considerações de threading para o objeto RealTimeStylus e as APIs (interfaces de programação de aplicativo) StylusInput, consulte Considerações de threading para as APIs StylusInput.