设备输入和事件(POS for .NET v1.14 SDK 文档)

所有 POS 设备都能够独立于应用程序生成事件或更改状态。 例如,如果操作员拔出 PinPad 设备,则应用程序无法直接检测此更改,因为它不是应用程序请求的状态更改。 服务对象必须通过某种方式向应用程序发出这些状态更改的警报。

多线程处理

由于让应用程序持续轮询服务对象的当前状态过于昂贵,因此需要另一种解决方案。 通常,解决方案是创建后台线程来监视设备。

如其他示例所示,创建阅读器线程对于输入设备(如扫描仪或磁条阅读器)始终是必需的。 但是,对于线路显示器和打印机等输出设备,通常需要使用第二个线程来监视状态更改(例如断电或脱机),然后将 StatusUpdateEvent 事件发送到应用程序。

这样,服务对象就可以响应来自应用程序的请求,同时异步监视硬件。

定义事件

事件是服务对象通知应用程序设备中发生状态更改或新数据到达的机制。

一般情况下,事件是一个线程或进程与另一个线程或进程之间发生的通知。 更具体地说,Microsoft Point of Service for .NET (POS for .NET) 使用 .NET 委托功能传递给应用程序。

统一服务点 (UnifiedPOS) 规范定义了一组五个事件:DataEvent、DirectIOEvent、ErrorEvent、OutputCompleteEvent 和 StatusUpdateEvent。 每个服务对象可能只允许支持其中一部分。 数据的确切内容还取决于服务对象类型。

事件队列

创建派生自其中一个 POS for .NET 基类的服务对象类时,不会将事件直接从服务对象发送到应用程序。 相反,会将事件放入由基类管理的队列中。 由于在将事件传递到应用程序之前必须满足一些条件,因此基类中的代码仅在适当情况下调度事件。 服务对象不需要注意队列或触发事件之前必须满足的要求。 这大大减轻了服务对象开发人员的负担。

事件队列使用其自己的线程以异步方式运行。 这意味着服务对象不会等待事件的实际传递。

将事件添加到队列

POS for .NET 基类提供了多种将事件添加到队列的方法,具体取决于服务对象和事件类型。

许多基类都有帮助程序方法来简化某些事件的排队;最常见的是 DataEvent 事件。 例如,MsrBase.GoodRead 方法可用于在成功读卡后将 DataEvent 事件排入队列。 同样,PosKeyboard.KeyDown 将 DataEvent 排入队列,指示已按下某个键。

当特定状态发生更改时,基类也可以自动将事件排入队列。 例如,如果服务对象已设置其 Properties.CapPowerReporting 属性,则只需在服务对象中设置 Properties.PowerState 属性即可发送指示电源更改的 StatusUpdateEvent。

最后,如果需要,服务对象可以使用任何 QueueEvent 替代专门将事件排入队列。 这最常用于发送 DirectIOEvent。 由于 DirectIOEvent 事件特定于供应商且特定于设备,因此不能使用通用机制将其排入队列。

同步输入

尽管大多数设备输入由服务对象异步读取,然后以事件的形式调度到应用程序,但在某些情况下,应用程序可能会从服务对象请求数据,直到数据准备就绪或达到超时后才会返回。 有关事件驱动的输入的详细信息,请参阅事件管理

另请参阅

任务

概念

其他资源