事件管理 (POS for .NET v1.14 SDK 文件)
事件管理代表 Microsoft Point of Service for .NET (POS for .NET) 程式設計應用程式的重要層面之一。 POS for .NET 系統中的所有輸入都是事件驅動,而 POS for .NET Architecture 的每個區段都會使用事件與其他應用程式和服務物件通訊。
事件驅動處理模型
當附加的 POS 裝置收到資料輸入時,就會開始事件驅動輸入。 如果啟用該裝置 (DeviceEnabled 屬性設定為 true),則接收的資料會排入佇列作為 DataEvent 事件,並傳送至應用程式。 事件是由內部服務執行緒以先進、先出的方式傳遞。 在引發此事件之前,服務物件可以使用 PreFireEvent 方法來更新該事件傳送之前的屬性。
收到事件資料之後,如果 AutoDisable 屬性設定為 true (DeviceEnabled 屬性設定為 false),則裝置會自動停用本身。 停用時,裝置無法排入新的輸入佇列,如果可能,實體裝置將會停用。
當應用程式準備好從裝置接收輸入時,會將 DataEventEnabled 屬性設定為 true。 應用程式接著會開始接收已排入佇列的 DataEvent 事件,即使這些 DataEvent 事件在 DataEventEnabled 屬性設定為 true 之前已排入佇列也一樣。
將 DataEventEnabled 屬性或 FreezeEvents 屬性設定為 false,即可停用其他資料事件。 這會導致稍後的輸入資料排入佇列,而應用程式處理目前的輸入和相關屬性。 當應用程式準備好取得更多資料時,可以將 DataEventEnabled 屬性設定為 true 來重新啟用事件。
Event-Driven 輸入與裝置共用
如果輸入裝置是獨佔用途的裝置,應用程式必須先宣告並啟用裝置,才能用來讀取輸入。
如果裝置是可共用的,一或多個應用程式必須先開啟並啟用裝置,才能用來讀取輸入。 應用程式必須先呼叫 Claim 方法,才能使用 DataEvent 要求對裝置的獨佔存取權,服務物件才能將資料傳送至該裝置。 如果收到事件驅動輸入,但裝置維持未重設狀態,則輸入會緩衝處理,直到應用程式宣告裝置且 DataEventEnabled 屬性設定為 true。 此行為可提升多個應用程式之間的裝置共用順序,有效地傳遞它們之間的輸入焦點。
Event-Driven 輸入和錯誤處理
如果收到事件驅動輸入時發生錯誤,裝置就會進入錯誤狀態。 然後這會將 ErrorEvent 事件排入佇列 (包含 InputData 或 InputErrorEvent loci) 。 在 DataEventEnabled 屬性設定為 true 之前,不會傳遞這些事件,確保應用程式排序次序的順序。 每個 ErrorEvent 都會指出兩個可能錯誤 loci 的其中一個負責:
- InputData -如果一或多個 DataEvent 事件排入佇列時發生錯誤,則會使用。 ErrorEvent 會跳到事件佇列的前端,以便立即處理,讓應用程式可以立即回應,方法是清除輸入或通知使用者錯誤。 然後完成緩衝處理輸入。
- Input - 如果發生錯誤且沒有可用的資料,則會使用。 如果輸入資料已在錯誤發生時排入佇列,則會先排入 InputData locus 的 ErrorEvent 並傳遞,然後會引發並處理佇列中的其餘 DataEvent。 最後,會傳送具有 Input 值的 ErrorEvent,以指出佇列是空的,而且沒有可用的資料。 請注意,如果傳遞具有 InputData 值的 ErrorEvent,且應用程式事件處理常式以 Clear 值回應,則不會傳遞此 InputDataErrorEvent。 一般而言,此錯誤會在事件佇列的結尾輸入。
當發生下列其中一項時,裝置可能會結束錯誤狀態:
- 應用程式會從 InputErrorEvent 傳回。 應用程式會從 InputDataErrorEvent 傳回針對 ErrorResponse 屬性的 Clear 值。
- 應用程式會呼叫 ClearInput 方法。
對於某些裝置,應用程式必須呼叫方法來開始事件驅動輸入。 服務物件收到輸入之後,通常不會收到額外的輸入,直到再次呼叫方法為止。 使用這種事件驅動輸入變化的裝置範例,也稱為非同步輸入,包括磁筆筆跡字元辨識 (MICR) 和簽章擷取裝置。 您可以讀取 DataCount 屬性,以取得佇列中的 DataEvent 事件數目。
呼叫 ClearInput 方法,即可刪除佇列中的所有輸入。 ClearInput 可能會在 Claim 獨佔用途裝置之後呼叫,或針對可共用裝置 Open。
一般事件驅動輸入模型不會防止定義包含直接傳回輸入資料的方法或屬性的裝置類別。 此事件驅動輸入變化的範例,也稱為同步輸入,即 Keylock 裝置。
活動類型
POS for .NET 可實作整合服務點 (UnifiedPOS) 事件,作為具有多播委派的標準 .NET 事件。 事件會通知應用程式各種活動或裝置的變更,例如新增或移除裝置時。 下表列出可能的事件型別。
事件 | 描述 |
---|---|
DataEvent | 服務物件引發的事件,通知應用程式輸入資料可供使用。 |
ErrorEvent | 服務物件引發的事件,通知應用程式發生裝置錯誤,且應用程式必須有適當的回應才能處理錯誤狀況。 |
StatusUpdateEvent | 服務物件引發的事件,向應用程式警示裝置狀態變更。 |
OutputCompleteEvent | 服務物件引發的事件,通知應用程式已成功完成佇列輸出要求。 |
DirectIOEvent | 服務物件引發的事件,直接向應用程式傳達資訊。 |
服務物件必須在內部建立和管理的佇列上堆疊這些事件。 事件是以先進、先出的方式傳遞,並由內部服務執行緒寄送。
下列條件會導致事件傳遞延遲,直到條件修正為止:
- 應用程式已將 FreezeEvents 屬性設定為 true。 FreezeEvents 屬性允許將事件排入佇列,但會防止其傳遞,直到 FreezeEvents 設定為 false 為止。
- 事件是 DataEvent 或輸入 ErrorEvent,但屬性 DataEventEnabled 為 false。
事件佇列管理的規則如下所示:
- 裝置啟用時只能將新事件排入佇列。
- 裝置會傳遞已排入佇列的事件,直到應用程式呼叫 Close 方法,或針對獨佔使用的裝置 Release 方法。 呼叫這些方法時,會刪除佇列中的任何剩餘事件。
- ClearInput 方法會清除 DataEvents 和輸入 DeviceErrorEvents (ErrorLocus = Input 或 InputData)。
- ClearOutput 方法會清除輸出 DeviceErrorEvents (ErrorLocus = Output)。