Udostępnij za pośrednictwem


Zagadnienia dotyczące wątków biblioteki zarządzanej

Poniższe zagadnienia dotyczące wątków Tablet PC są typowe dla zarządzanej biblioteki.

Thread-Safety

Klasy biblioteki zarządzanej platformy tabletu nie są zwykle bezpieczne wątkowo. Następujące kolekcje są bezpieczne wątkowo na poziomie elementu członkowskiego; jednak te kolekcje nie gwarantują, że moduł wyliczający jest chroniony, jeśli inny wątek działa jednocześnie w kolekcji:

Aplikacje STA i MTA

Aplikacje zarządzane utworzone przy użyciu kreatorów zawartych w programie Microsoft Visual Studio .NET działają domyślnie w modelu jednowątkowym (STA). Mieszkanie dla aplikacji można zmienić, ustawiając atrybut wątku STA lub wątku wielowątkowego (MTA) w punkcie wejścia aplikacji.

Jeśli aplikacja działa w usłudze MTA, musisz napisać kod bezpieczny wątkowo; Jednak dzięki temu można poprawić niektóre problemy z wydajnością obsługi zdarzeń.

Aby uzyskać więcej informacji na temat atrybutów wątku STA i wątku MTA, zobacz STAThreadAttribute klasa i MTAThreadAttribute klasa.

Zagadnienia dotyczące wątków formularzy systemu Windows

Kontrolki InkPicture i InkEdit rozszerzają kontrolki windows Forms. Kontrolki Windows Forms korzystają z modelu jednowątkowego apartamentu (STA), ponieważ formularze systemu Windows są oparte na natywnych oknach Win32, które z natury są jednowątkowe. W kodzie zarządzanym kontrolki pisma odręcznego powinny być tworzone w tym samym wątku co główny wątek formularza.

W aplikacji STA niektóre zdarzenia występują w wątku innym niż wątek interfejsu użytkownika aplikacji. Podczas wywoływania dowolnego obiektu lub kontrolki formularzy systemu Windows, w tym InkPicture i kontrolki InkEdit, z poziomu programu obsługi zdarzeń komputera tabletu użyj dziedziczonego obiektu lub kontrolki Control.Invoke metody. Właściwość InvokeRequired dziedziczona z klasy Control może służyć do określenia, czy jest to konieczne.

Na przykład w poniższej procedurze obsługi dla zdarzenia Recognition testowana jest właściwość InvokeRequired i jeśli ma wartość PRAWDA, procedura obsługi zdarzenia jest ponownie wywoływana z wątku interfejsu użytkownika.

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

Jeśli umieścisz UserControl na stronie internetowej w przeglądarce (zobacz Web Controls), zostanie ona uruchomiona jako aplikacja STA. W przypadku aplikacji klienckich inteligentnych (zobacz No Touch Deployment), deweloper ma pełną kontrolę nad ApartmentState. (Wartość domyślna to zazwyczaj STA, ale może być MTA, w zależności od używanej wersji środowiska CLR.) Aby uzyskać informacje o problemach z wątkami związanych z RealTimeStylus, zobacz Zagadnienia dotyczące wątków dla interfejsów API StylusInput.

Aby uzyskać więcej informacji na temat wywoływania formularzy Windows z aplikacji MTA, zobacz Przykład wielowątkowej kontrolki formularza Windows.

Zagadnienia dotyczące schowka

Obiekt Schowek działa tylko z wątku STA. Podczas próby skopiowania do schowka lub wklejenia z wątku, który nie jest STA, pojawia się ThreadStateException. Jeśli Twoja aplikacja jest MTA, utwórz wątek STA do obsługi wywołań metod Schowka oraz niektórych innych aspektów interfejsu użytkownika aplikacji.

Wyjątki w programie obsługi zdarzeń

Nie można zgłaszać wyjątków z programów obsługujących zdarzenia Tablet PC. Jeśli na przykład delegat programu obsługi zdarzeń dla obiektu lub kolekcji tabletu ma trzech zarejestrowanych handlerów, a pierwszy zgłasza wyjątek, wystąpi następująca sekwencja:

  1. Pierwszy program obsługi kończy działanie.
  2. Wyjątek zostanie utracony.
  3. Pozostałe programy obsługi nie są wywoływane.

Usuwanie obiektów i kontrolek

Aby uniknąć przecieku pamięci, należy jawnie wywołać metodę Dispose na dowolnym obiekcie lub kontrolce komputera tabletu, do którego został dołączony program obsługi zdarzeń, zanim obiekt lub kontrolka wykracza poza zakres.

Aby zwiększyć wydajność aplikacji, należy ręcznie usunąć dowolny obiekt lub kontrolkę tabletu, która implementuje metodę Dispose, gdy obiekt lub kontrolka nie są już potrzebne.

Interfejsy API StylusInput

Aby uzyskać informacje na temat zagadnień związanych z wątkami dla obiektu RealTimeStylus oraz interfejsów programowania aplikacji (API) StylusInput, zobacz Zagadnienia dotyczące wątków dla interfejsów API StylusInput.