托管库线程处理注意事项
以下 Tablet PC 线程处理注意事项特定于托管库。
Thread-Safety
平板电脑平台的托管库类通常不是线程安全的。 以下集合在成员级别是线程安全的;但是,如果另一个线程同时对集合进行操作,这些集合并不能保证枚举器受到保护:
STA 和 MTA 应用程序
默认情况下,使用 Microsoft Visual Studio .NET 中包含的向导创建的托管应用程序是单线程单元 (STA) 。 可以通过在应用程序的入口点上设置 STA 线程或多线程单元 (MTA) 线程属性来更改应用程序的单元。
如果应用程序在 MTA 中运行,则必须编写线程安全代码;但是,这样做可以改善某些事件处理性能问题。
有关 STA 线程和 MTA 线程属性的详细信息,请参阅 STAThreadAttribute 类和 MTAThreadAttribute 类。
Windows 窗体线程处理注意事项
InkPicture 和 InkEdit 控件扩展Windows 窗体控件。 Windows 窗体控件使用单线程单元 (STA) 模型,因为Windows 窗体基于本机 Win32 窗口,这些窗口本质上是单线程的。 在托管代码中,墨迹控件应在与窗体main线程相同的线程中创建。
在 STA 应用程序中,某些事件发生在应用程序用户界面 (UI) 线程以外的线程上。 从 Tablet PC 事件处理程序中调用任何Windows 窗体对象或控件(包括 InkPicture 和 InkEdit 控件)时,请使用对象或控件继承的 Control.Invoke 方法。 从 Control 类继承的 InvokeRequired 属性可用于确定是否有必要。
例如,在 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 放在浏览器中的 webpage (查看 Web 控件) ,则它将作为 STA 应用程序运行。 对于智能客户端应用程序 (请参阅 无触摸部署) ,开发人员可以完全控制 ApartmentState。 (默认值通常为 STA,但可能是 MTA,具体取决于 CLR.) 对于涉及 RealTimeStylus 的线程问题,请参阅 StylusInput API 的线程处理注意事项。
有关从 MTA 应用程序调用Windows 窗体的详细信息,请参阅多线程Windows 窗体控件示例。
剪贴板注意事项
剪贴板对象仅适用于 STA 线程。 尝试从非 STA 线程复制到剪贴板或从剪贴板粘贴时,会收到 ThreadStateException。 如果应用程序是 MTA,请创建 STA 线程来处理剪贴板的方法调用和应用程序的一些其他 UI 方面。
事件处理程序中的异常
无法从 Tablet PC 事件处理程序中引发异常。 例如,如果 Tablet PC 对象或集合的事件处理程序委托具有三个已注册的处理程序,并且第一个处理程序引发异常,则会发生以下顺序:
- 第一个处理程序退出。
- 异常丢失。
- 不会调用剩余的处理程序。
释放对象和控件
若要避免内存泄漏,必须在对象或控件超出范围之前,对已附加事件处理程序的任何 Tablet PC 对象或控件显式调用 Dispose 方法。
若要提高应用程序的性能,请在不再需要该对象或控件时手动释放实现 Dispose 方法的任何 Tablet PC 对象或控件。
StylusInput API
有关 RealTimeStylus 对象的线程处理注意事项和 StylusInput 应用程序编程接口 (API 的信息) 请参阅 StylusInput API 的线程处理注意事项。