Partilhar via


Exemplo de saída assíncrona (documentação do SDK do PDV para .NET v1.14)

O Microsoft Point of Service for .NET (POS para .NET) oferece suporte à saída assíncrona em conformidade com a especificação UnifiedPOS (Unified Point Of Service). No modelo de saída assíncrona, o Objeto de Serviço deve enfileirar solicitações de saída para que possa retornar o controle ao aplicativo o mais rápido possível. Um segundo thread deve então despachar a saída para o dispositivo e notificar os aplicativos quando a solicitação tiver sido atendida, com um evento OutputCompleteEvent ou ErrorEvent.

A biblioteca de classes POS para .NET lida com a maioria dessas funções para o desenvolvedor de objeto de serviço para que haja pouca ou nenhuma diferença entre um dispositivo de saída assíncrona e um dispositivo somente de saída síncrona.

Para criar o projeto

  1. Crie um projeto de biblioteca de classes do Visual Studio.

  2. Adicione o código de exemplo abaixo ao seu projeto.

  3. Adicione referências aos assemblies Microsoft.PointOfService .

  4. Compile e copie o Objeto de Serviço para um dos diretórios no caminho de carregamento do assembly do Objeto de Serviço.

Para usar o exemplo de aplicativo com o objeto de serviço

  • Este objeto de serviço pode ser usado com o exemplo de aplicativo apresentado em Exemplo de manipulador de eventos.

Exemplo

Para exportar para um dispositivo PosPrinter , um aplicativo geralmente usará o PrintNormal(PrinterStation, String) método. Observe que o código de objeto de serviço PosPrinter abaixo não fornece uma implementação para esse método. Em vez disso, PrintNormalImpl(PrinterStation, PrinterState, String) é implementado. Esse método é chamado pela biblioteca POS para .NET para solicitações de saída síncronas e assíncronas.

Quando um aplicativo chama um método de saída, como PrintNormal, a implementação do PDV para .NET verifica o valor da AsyncMode propriedade. Se esse valor for false, a biblioteca POS para .NET enviará a solicitação para PrintNormalImpl imediatamente e aguardará que ela retorne. No entanto, se o valor for true, a implementação do POS para .NET do PrintNormal adicionará a solicitação a uma fila gerenciada internamente. Enquanto houver itens na fila, um thread gerenciado do PDV para .NET enviará cada solicitação, na ordem FIFO (first-in-first-out), para o dispositivo chamando PrintNormalImpl. Quando PrintNormalImpl retorna, a implementação da biblioteca gerará um OutputCompleteEvent no aplicativo. Em resumo, o mesmo código de objeto de serviço pode suportar saída síncrona e assíncrona sem nunca precisar saber qual modo de saída está sendo usado.

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

O código do aplicativo no exemplo de manipulador de eventos pode ser compilado e executado com este objeto de serviço.

Consulte Também

Tarefas

Conceitos

Outros Recursos