Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Microsoft Point of Service para .NET (POS para .NET) admite la salida asincrónica de conformidad con la especificación de punto de servicio unificado (UnifiedPOS). En el modelo de salida asincrónica, el objeto de servicio debe poner en cola las solicitudes de salida para que pueda devolver el control a la aplicación lo antes posible. A continuación, un segundo subproceso debe enviar la salida al dispositivo y notificar a las aplicaciones cuando se haya cumplido la solicitud, ya sea con un eventoOutputCompleteEvent o ErrorEvent.
La biblioteca de clases de POS para .NET controla la mayoría de estas funciones para el desarrollador de objetos de servicio, para que haya poca diferencia, si existe, entre un dispositivo de salida asincrónica y un dispositivo solo de salida sincrónica.
Para crear el proyecto
Cree un proyecto de biblioteca de clases de Visual Studio.
Agregue el código de ejemplo siguiente al proyecto.
Agregue referencias a los ensamblados Microsoft.PointOfService.
Compile y copie el objeto de servicio en uno de los directorios de la ruta de carga del ensamblado del objeto de servicio.
Para usar el ejemplo de aplicación con el objeto de servicio
- Este objeto de servicio se puede usar con el ejemplo de aplicación presentado en Ejemplo de controlador de eventos.
Ejemplo
Para generar una salida en un dispositivo PosPrinter, una aplicación usará normalmente el método PrintNormal(PrinterStation, String). Tenga en cuenta que el código de objeto de servicio PosPrinter siguiente no proporciona una implementación para este método. En su lugar, se implementa PrintNormalImpl(PrinterStation, PrinterState, String). La biblioteca de POS para .NET llama a este método para las solicitudes de salida sincrónicas y asincrónicas.
Cuando una aplicación llama a un método de salida, como PrintNormal, la implementación de POS para .NET comprueba el valor de la propiedad AsyncMode. Si este valor es false, la biblioteca de POS para .NET envía la solicitud a PrintNormalImpl inmediatamente y espera a que se devuelva. Sin embargo, si el valor es true, la implementación de POS para .NET de PrintNormal agrega la solicitud a una cola administrada internamente. Aunque hay elementos en la cola, un subproceso administrado de POS para .NET enviará cada solicitud, siguiendo el orden "primero en entrar primero en salir" (FIFO), al dispositivo mediante una llamada a PrintNormalImpl. Cuando PrintNormalImpl devuelve el resultado, la implementación de la biblioteca generará un elemento OutputCompleteEvent en la aplicación. En resumen, el mismo código de objeto de servicio puede admitir salidas sincrónicas y asincrónicas sin necesidad de saber qué modo de salida se está usando.
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
}
}
El código de aplicación del ejemplo de controlador de eventos se puede compilar y ejecutar con este objeto de servicio.