统一服务点 (UnifiedPOS) 输出模型由两种输出类型组成:同步和异步。 POS 设备类型可能支持一种或两种类型,或者都不支持。
同步输出
当应用程序使用特定于设备类型的同步方法写入输出时,写入操作将发生在调用该方法的同一线程上。 在写入操作完成或失败之前,服务对象可能不会返回。
使用同步输出很简单,但如果无法相对快速地完成输出,则可能会影响应用程序性能。 服务对象开发人员应考虑到这一点。
异步输出
某些 POS 设备类型支持异步输出。 在异步输出模型中,应用程序调用服务对象以请求将数据输出到设备。 但是,与同步模型不同,服务对象不得等待写入操作完成;相反,它应尽快将控制权返回给应用程序。 当服务对象收到来自应用程序的请求时,它应执行以下操作:
- 如果物理设备无法接收数据,服务对象应在内存中对其进行缓冲,直到设备准备就绪。
- 将 OutputId 属性设置为此请求的标识符,以便在发送到应用程序的未来事件期间使用。
- 尽快返回。
然后,服务对象必须等待设备完成请求。 通常,这是使用单独的线程完成的,该线程由监视硬件的服务对象管理。 请求成功完成后,OutputEventArgs.OutputId 设置为先前指定的标识符的 OutputCompleteEvent 事件将排队,以便传递到应用程序。
服务对象托管队列
POS for .NET 类库提供对异步输出的支持,这对于几乎所有服务对象方案都足够了。
但是,在某些情况下,服务对象开发人员可能需要实现自己的异步输出处理。 主要方案是支持那些支持基于硬件的打印队列的设备。 在这种情况下,服务对象将 UseExternalPrintQueue 设置为 true,重写 PreQueuePrintData 方法,并实现其自己的队列机制。
当 UseExternalPrintQueue 设置为 true 时,Base 类不再将打印请求添加到其内部异步队列,因此由服务对象开发人员以任何所需的方式对数据进行排队。 这通常通过使用设备的硬件打印排队功能来完成。 Base 类仍预先验证相同的打印请求,但不进行任何其他处理。
在这些情况下,服务对象将负责以下事项:
- 实现自己的队列逻辑。
- 发送 StatusUpdateEvents 以成功执行操作。
- 为失败的异步操作发送 ErrorEvents 并处理重试。
- 更新状态属性。
- UnifiedPOS 规范中定义的所有其他异步操作。