Рекомендации по потоковой работе с управляемой библиотекой
Следующие рекомендации по потоковой работе с планшетными компьютерами относятся к управляемой библиотеке.
- Потокобезопасность
- Приложения STA и MTA
- Windows Forms Вопросы потоков
- Рекомендации по буферу обмена
- Исключения в обработчиках событий
- Удаление объектов и элементов управления
- API StylusInput
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 для обработки вызовов методов буфера обмена и некоторых других аспектов пользовательского интерфейса приложения.
Исключения в обработчиках событий
Исключения не могут создаваться из обработчиков событий планшетного компьютера. Например, если делегат обработчика событий для объекта или коллекции планшетного компьютера имеет три зарегистрированных обработчика и первый вызывает исключение, происходит следующая последовательность:
- Первый обработчик завершает работу.
- Исключение потеряно.
- Остальные обработчики не вызываются.
Удаление объектов и элементов управления
Чтобы избежать утечки памяти, необходимо явным образом вызвать метод Dispose для любого объекта планшетного компьютера или элемента управления, к которому был подключен обработчик событий, прежде чем объект или элемент управления выйдет из область.
Чтобы повысить производительность приложения, вручную удалите любой объект или элемент управления планшетного компьютера, реализующий метод Dispose , когда объект или элемент управления больше не нужен.
API StylusInput
Сведения о рекомендациях по потоковой работе для объекта RealTimeStylus и программных интерфейсов StylusInput см. в разделе Вопросы потоков для API StylusInput.