如果部件只有一个执行线程,则在任何时刻都只能执行一个对象的代码。部件对象模式 (COM) 的自动化特性通过请求的序列化来处理这种情况。也就是说,将所有的请求排队等候,每次处理一个,直至全部处理完毕。
在多线程操作环境中,序列化可以保护单线程对象不同时处理多个客户端请求,就是说,如果前面的客户端请求还在执行,后面的属性或方法的代码不会覆盖它的执行。如果对象不是可重入的,覆盖请求就会导致内部数据错误。请参阅“Visual Basic 中的单元模型线程化”。
因此,序列化是自动化的重要功能。不过,单线程部件的序列化也意味着有时会发生请求阻塞。例如,假设使用的 Widget 对象有两个方法:
由于 32 位的应用程序是抢先多任务的,在运行 Spin 方法时,可能会有第二个应用程序调用 Flip 方法。如图 8.2 所示,短的 Flip 方法将被长的 Spin 方法堵塞。
图 8.2 使用 MultiUse 对象的部件时可能发生阻塞
当短操作被长操作阻塞时,生产效率将明显下降,用户也会焦躁不安。部件的这种行为称为“长短任务的不适应性”。就是说,如果要执行的请求所需的时间长短不齐,该部件就会表现得很差。
Visual Basic 提供了两种部件特性来避免调用的阻塞:多线程与 SingleUse 对象。这些特性在下述主题中介绍: