Partager via


Exemple de sortie asynchrone (documentation du SDK POS pour .NET v1.14)

Microsoft Point of Service pour .NET (POS pour .NET) prend en charge la sortie asynchrone conformément à la spécification Unified Point Of Service (UnifiedPOS). Dans le modèle de sortie asynchrone, l’objet de service doit mettre en file d’attente les demandes de sortie afin qu’il puisse retourner le contrôle à l’application aussi rapidement que possible. Un deuxième thread doit ensuite distribuer la sortie à l’appareil et notifier les applications lorsque la demande a été satisfaite, avec un OutputCompleteEvent, ou ErrorEvent.

La bibliothèque de classes POS pour .NET gère la plupart de ces fonctions pour le développeur d’objets de service afin qu’il y ait peu, voire aucune, différence entre un appareil de sortie asynchrone et un appareil de sortie synchrone uniquement.

Pour créer le projet

  1. Créez un projet de bibliothèque de classes Visual Studio.

  2. Ajoutez l’exemple de code ci-dessous à votre projet.

  3. Ajoutez des références aux assemblys Microsoft.PointOfService.

  4. Compilez et copiez l’objet de service dans l’un des répertoires de votre chemin de chargement de l’assembly d’objet de service.

Pour utiliser l’exemple d’application avec l’objet de service

Exemple

Pour générer une sortie vers un appareil PosPrinter, une application utilise généralement la méthode PrintNormal(PrinterStation, String). Notez que le code d’objet de service PosPrinter ci-dessous ne fournit pas d’implémentation pour cette méthode. Au lieu de cela, PrintNormalImpl(PrinterStation, PrinterState, String) est implémenté. Cette méthode est appelée par la bibliothèque POS pour .NET pour les demandes de sortie synchrones et asynchrones.

Lorsqu’une application appelle une méthode de sortie, comme PrintNormal, l’implémentation POS pour .NET vérifie la valeur de la propriété AsyncMode. Si cette valeur est false, la bibliothèque POS pour .NET envoie immédiatement la requête à PrintNormalImpl et attend qu’elle soit retournée. Toutefois, si la valeur est true, l’implémentation POS pour .NET de PrintNormal ajoute la requête à une file d’attente gérée en interne. Bien qu’il y ait des éléments dans la file d’attente, un thread managé POS pour .NET envoie chaque requête, dans l’ordre FIFO (premier entré, premier sorti) à l’appareil en appelant PrintNormalImpl. Lorsque PrintNormalImpl est retourné, l’implémentation de la bibliothèque déclenche un OutputCompleteEvent dans l’application. En bref, le même code d’objet de service peut prendre en charge les sorties synchrones et asynchrones sans jamais avoir besoin de savoir quel mode de sortie est utilisé.

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
    }
}

Le code de l’application dans l’Exemple de gestionnaire d’événements peut être compilé et exécuté avec cet objet de service.

Voir aussi

Tâches

Concepts

Autres ressources