Compartir a través de


Uso de métodos Impl para salidas sincrónicas o asincrónicas (documentación del SDK de POS para .NET v1.14)

Algunos tipos de dispositivos POS admiten la salida impresa o mostrada, por ejemplo, PosPrinter o LineDisplay. Los objetos de servicio escritos para los dispositivos habilitados para salida deben proporcionar compatibilidad con la salida asincrónica y sincrónica.

Una aplicación que realiza una operación de forma asincrónica establecerá la propiedad AsyncMode del objeto de servicio en true antes de llamar al método de salida deseado. El objeto de servicio puede producir una excepción si no puede procesar la solicitud de forma asincrónica, pero esto no es ideal, ya que limita el ámbito de las aplicaciones que pueden usar ese objeto de servicio determinado.

Sin embargo, la compatibilidad con la salida asincrónica puede requerir código adicional y potencialmente complicado. Este código administraría una cola de solicitudes entrantes, mantendría un subproceso para supervisar la cola, enviaría solicitudes en el orden adecuado y devolvería los eventos a la aplicación.

Las clases Base de Microsoft Point of Service para .NET (POS para .NET) pueden administrar todas estas tareas para el desarrollador. Para cada método de salida, la clase Base tiene un método auxiliar asociado a cada método de salida. Estos métodos, que terminan con el sufijo Impl, se escriben como si fueran simplemente la implementación sincrónica de su método primario. La clase Base administra de forma transparente una cola, envía solicitudes a las funciones Impl en el momento adecuado y en el orden correcto y devuelve los eventos adecuados a la aplicación. Se llama a este mismo método para las operaciones sincrónicas y asincrónicas.

Al realizar la derivación de una clase Base de POS para .NET, el objeto de servicio obtiene una funcionalidad asincrónica sin implementar código adicional.

Implementación de la clase base

POS para .NET proporciona clases Base para un subconjunto de tipos de dispositivos POS. Para cada método de salida de estas clases, hay un método correspondiente con un sufijo Impl. El objeto de servicio derivado de una clase Base solo debe invalidar el método Impl y no el método primario correspondiente. Por ejemplo, en una clase derivada de la clase basePosPrinterBase de POS para .NET, el objeto de servicio proporcionaría una implementación para PrintNormalImpl y no invalidaría PrintNormal.

Las clases Base de POS para .NET implementan todos los métodos de salida y realizan las siguientes tareas para admitir el método Impl implementado por el objeto de servicio:

  • Validar argumentos.
  • Si la propiedad AsyncMode es false, se llama inmediatamente al método Impl correspondiente.
  • Si la propiedad AsyncMode está establecida en true:
    1. La solicitud se coloca en una cola. Esta cola es propiedad de POS para .NET y está administrada por su propio subproceso.
    2. El subproceso de la cola examina las solicitudes de la cola y se llama al método Impl correspondiente. Esta llamada podría retrasarse si el dispositivo ya está procesando una solicitud de salida o si existe una solicitud de mayor prioridad en la cola.
  • Cuando se devuelve el método Impl , el código de clase base de POS para .NET controla todos los resultados. Para una llamada sincrónica, el método puede devolver un valor o producir una excepción. Para una llamada asincrónica, el método puede devolver los eventos OutputCompleteEvent o ErrorEvent a la aplicación.
  • Los métodos Impl también pueden devolver un objeto que no solo contiene información del error, sino también valores estadísticos.

Métodos de Impl del objeto de servicio

Dado que la mayoría del procesamiento se controla mediante el código de clase Base, el método Impl del objeto de servicio puede ser relativamente sencillo.

En muchos casos, el método Impl requiere el estado del dispositivo en el momento de la llamada original. En estas situaciones, el código de clase Base guarda el estado actual del dispositivo junto con la solicitud de salida. El estado del dispositivo se envía posteriormente como argumento al método Impl. Por ejemplo, la definición de PrintNormalImpl es:

protected override PrintResults PrintNormalImpl(
    PrinterStation station,
    PrinterState printerState,
    string data);

El argumento printerState anterior es específico del método Impl y no existe en la definición PrintNormal(PrinterStation, String).

El valor devuelto de las funciones Impl también difiere de sus métodos de llamada. Por ejemplo, tenga en cuenta que el método PrintNormalImpl devuelve una clase de tipo PrintResults. Además de ErrorCode, ErrorCodeExtended, ErrorLevel y ErrorString, hay varias propiedades adicionales que el método de llamada usará para actualizar los recuentos estadísticos.

Ejemplo

En el ejemplo siguiente se muestra cómo se implementan estos métodos en el código de objeto de servicio.

protected override PrintResults PrintNormalImpl(
        PrinterStation station,
        PrinterState printerState,
        string data)
{
    // First, create a PrintResults object to hold return values.
    PrintResults pr = new PrintResults();

    // Now print, depending on the station.
    if (station == PrinterStation.Receipt)
    {
        // Your code goes here.

        // Update statistics to be returned to the caller.
        pr.ReceiptLinePrintedCount = 1;
        pr.ReceiptCharacterPrintedCount = data.Length;
    }
    else if (station == PrinterStation.Slip)
    {
        // Your code goes here.

        // Update statistics to be returned to the caller.
        pr.SlipLinePrintedCount = 1;
        pr.SlipCharacterPrintedCount = data.Length;
    }

    return pr;
}

Consulte también

Tareas

Referencia

Conceptos

Otros recursos