Freigeben über


Beispiel für asynchrone Ausgabe (Dokumentation zum POS für .NET v1.14 SDK)

Microsoft Point of Service für .NET (POS für .NET) unterstützt die asynchrone Ausgabe gemäß der UnifiedPOS-Spezifikation (Unified Point Of Service). Im asynchronen Ausgabemodell muss das Serviceobjekt Ausgabeanforderungen in die Warteschlange stellen, damit es die Steuerung so schnell wie möglich an die Anwendung zurückgeben kann. Ein zweiter Thread muss dann die Ausgabe an das Gerät senden und Anwendungen benachrichtigen, wenn die Anforderung erfüllt wurde, entweder mit einem OutputCompleteEvent- oder einem ErrorEvent-Ereignis.

Die POS für .NET-Klassenbibliothek verarbeitet die meisten dieser Funktionen für den Serviceobjektentwickler, sodass es nur wenige Unterschiede zwischen einem asynchronen Ausgabegerät und einem synchronen Ausgabegerät gibt.

So erstellen Sie das Projekt

  1. Erstellen Sie ein Visual Studio-Klassenbibliotheksprojekt.

  2. Fügen Sie dem Projekt den folgenden Beispielcode hinzu.

  3. Fügen Sie Verweise auf die Microsoft.PointOfService-Assemblys hinzu.

  4. Kompilieren Sie das Serviceobjekt, und kopieren Sie es in eines der Verzeichnisse im Ladepfad der Serviceobjektassembly.

So verwenden Sie das Anwendungsbeispiel mit dem Serviceobjekt

Beispiel

Für die Ausgabe an ein PosPrinter-Gerät verwendet eine Anwendung am häufigsten die PrintNormal(PrinterStation, String)-Methode. Beachten Sie, dass der unten stehende PosPrinter-Serviceobjektcode keine Implementierung für diese Methode bereitstellt. Stattdessen wird PrintNormalImpl(PrinterStation, PrinterState, String) implementiert. Diese Methode wird von der POS für .NET-Bibliothek sowohl für synchrone als auch für asynchrone Ausgabeanforderungen aufgerufen.

Wenn eine Anwendung eine Ausgabemethode aufruft, z. B. PrintNormal, überprüft die POS für .NET-Implementierung den Wert der AsyncMode-Eigenschaft. Wenn dieser Wert false ist, sendet die POS für .NET-Bibliothek die Anforderung sofort an PrintNormalImpl und wartet auf die Rückgabe. Wenn der Wert jedoch true ist, fügt die POS für .NET-Implementierung von PrintNormal die Anforderung einer intern verwalteten Warteschlange hinzu. Während sich Elemente in der Warteschlange befinden, sendet ein verwalteter POS für .NET-Thread jede Anforderung in FIFO-Reihenfolge (First-in-First-Out) durch Aufrufen von PrintNormalImpl an das Gerät. Bei der Rückgabe von PrintNormalImpl löst die Bibliotheksimplementierung ein OutputCompleteEvent in der Anwendung aus. Kurz gesagt, derselbe Serviceobjektcode kann sowohl die synchrone als auch die asynchrone Ausgabe unterstützen, ohne jemals wissen zu müssen, welcher Ausgabemodus verwendet wird.

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using Microsoft.PointOfService;
using Microsoft.PointOfService.BaseServiceObjects;

[assembly: PosAssembly("Service Object Contractors, Inc.")]

namespace SOSamples.AsyncOutput
{
    [ServiceObject(
            DeviceType.PosPrinter,
            "AsyncOutputPrinter",
            "Sample Async Printer",
            1,
            9)]

    public class AsyncOutputSimulator : PosPrinterBase
    {
        public AsyncOutputSimulator()
        {
            DevicePath = "Sample Async Printer";

            // Indicate that the Service Object supports
            // the receipt printer.
            Properties.CapRecPresent = true;
        }

        // Note that this method will be called by the POS for .NET
        // library code, regardless of whether the print request
        // is synchronous or asynchronous. The print request
        // queue is managed completely by POS for .NET so the
        // Service Object should simply write data to the device
        // here.
        protected override PrintResults PrintNormalImpl(
                        PrinterStation station,
                        PrinterState printerState,
                        string data)
        {
            // Your code to print to the actual hardware would go
            // here.

            // For demonstration, however, the code simulates
            // that fulfilling this print request took 4 seconds.
            Thread.Sleep(4000);

            PrintResults results = new PrintResults();
            return results;
        }

        // This method must be implemented by the Service
        // Object, and should validate the data to be printed,
        // including any escape sequences. This method should throw
        // a PosControlException to indicate failure.
        protected override void ValidateDataImpl(
                        PrinterStation station,
                        string data)
        {
            // Insert your validation code here.
            return;
        }

        #region Implement Abstract PosCommon Members
        private string MyHealthText = "";

        // PosCommon.CheckHealthText.
        public override string CheckHealthText
        {
            get
            {
                // VerifyState(mustBeClaimed,
                // mustBeEnabled).
                VerifyState(false, false);
                return MyHealthText;
            }
        }

        //  PosCommon.CheckHealth.
        public override string CheckHealth(
                        HealthCheckLevel level)
        {
            // Verify that device is open, claimed, and enabled.
            VerifyState(true, true);

            // Insert your code here:
            // check the health of the device and return a
            // descriptive string.

            // Cache result in the CheckHealthText property.
            MyHealthText = "Ok";
            return MyHealthText;
        }

        // PosCommon.DirectIOData.
        public override DirectIOData DirectIO(
                                int command,
                                int data,
                                object obj)
        {
            // Verify that the device is open.
            VerifyState(false, false);

            return new DirectIOData(data, obj);
        }
        #endregion Implement Abstract PosCommon Members
    }
}

Der Anwendungscode im Ereignishandlerbeispiel kann kompiliert und mit diesem Serviceobjekt ausgeführt werden.

Weitere Informationen

Aufgaben

Konzepte

Weitere Ressourcen