Поделиться через


Рекомендации по потоковой работе с управляемой библиотекой

Следующие рекомендации по потоковой работе с планшетными компьютерами относятся к управляемой библиотеке.

Thread-Safety

Классы управляемой библиотеки платформы планшетных компьютеров обычно не являются потокобезопасны. Следующие коллекции являются потокобезопасны на уровне элементов; Однако эти коллекции не гарантируют, что перечислитель будет защищен, если другой поток работает с коллекцией одновременно:

Приложения STA и MTA

Управляемые приложения, созданные с помощью мастеров, содержащихся в Microsoft Visual Studio .NET, по умолчанию являются однопоточными подразделениями (STA). Вы можете изменить квартиру для приложения, задав атрибут потока STA или многопоточного потока (MTA) в точке входа приложения.

Если приложение выполняется в MTA, необходимо написать потокобезопасный код; тем не менее, это позволяет улучшить некоторые проблемы с производительностью обработки событий.

Дополнительные сведения об атрибутах потока STA и потока MTA см. в разделах Класс STAThreadAttribute и Класс MTAThreadAttribute .

Windows Forms Вопросы потоков

Элементы управления InkPicture и InkEdit расширяют Windows Forms элементов управления. Windows Forms элементах управления используется модель однопотокового подразделения (STA), так как Windows Forms основаны на собственных окнах Win32, которые изначально являются однопоточными. В управляемом коде элементы управления рукописным вводом должны создаваться в том же потоке, что и поток main для формы.

В приложении STA определенные события происходят в потоке, отличном от потока пользовательского интерфейса приложения. При вызове любого объекта или элемента управления Windows Forms, включая элементы управления InkPicture и InkEdit, из обработчика событий планшетного компьютера используйте унаследованный метод Control.Invoke объекта или элемента управления. Свойство InvokeRequired, унаследованное от класса Control, можно использовать для определения необходимости.

Например, в следующем обработчике событий для события Recognition проверяется свойство InvokeRequired , а если задано значение TRUE, обработчик событий повторно вызывается из потока пользовательского интерфейса.

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

Если поместить элемент UserControl на веб-страницу в браузере (см. раздел Веб-элементы управления), он будет выполняться как приложение STA. Для интеллектуальных клиентских приложений (см . раздел Без сенсорного развертывания) разработчик имеет полный контроль над ApartmentState. (По умолчанию обычно используется STA, но может быть MTA в зависимости от версии среды CLR.) Сведения о проблемах с потоком, связанных с RealTimeStylus, см. в статье Threading Considerations for the StylusInput API.

Дополнительные сведения о вызове Windows Forms из приложения MTA см. в разделе Пример многопоточного элемента управления Windows Forms.

Рекомендации по буферу обмена

Объект буфера обмена работает только из потока STA. При попытке скопировать в буфер обмена или вставить его из потока, который не является STA, вы получаете исключение ThreadStateException. Если приложение является MTA, создайте поток STA для обработки вызовов методов буфера обмена и некоторых других аспектов пользовательского интерфейса приложения.

Исключения в обработчиках событий

Исключения не могут создаваться из обработчиков событий планшетного компьютера. Например, если делегат обработчика событий для объекта или коллекции планшетного компьютера имеет три зарегистрированных обработчика и первый вызывает исключение, происходит следующая последовательность:

  1. Первый обработчик завершает работу.
  2. Исключение потеряно.
  3. Остальные обработчики не вызываются.

Удаление объектов и элементов управления

Чтобы избежать утечки памяти, необходимо явным образом вызвать метод Dispose для любого объекта планшетного компьютера или элемента управления, к которому был подключен обработчик событий, прежде чем объект или элемент управления выйдет из область.

Чтобы повысить производительность приложения, вручную удалите любой объект или элемент управления планшетного компьютера, реализующий метод Dispose , когда объект или элемент управления больше не нужен.

API StylusInput

Сведения о рекомендациях по потоковой работе для объекта RealTimeStylus и программных интерфейсов StylusInput см. в разделе Вопросы потоков для API StylusInput.