Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Alguns tipos de dispositivo do POS dão suporte à saída impressa ou exibida, por exemplo, o PosPrinter ou LineDisplay. Os Objetos de Serviço gravados para dispositivos habilitados para saídas devem fornecer suporte para saída assíncrona e síncrona.
Um aplicativo que executa uma operação de forma assíncrona definirá a propriedade AsyncMode do Objeto de Serviço como true antes de chamar o método de saída desejado. O Objeto de Serviço poderá gerar uma exceção se não for possível processar a solicitação de forma assíncrona, mas isso não é o ideal, pois limita o escopo de aplicativos que podem usar esse Objeto de Serviço específico.
No entanto, o suporte para saída assíncrona pode exigir um código adicional e potencialmente complicado. Esse código gerenciaria uma fila de solicitações de entrada, manteria um thread para monitorar as solicitações de fila e expedir na ordem adequada e geraria eventos de volta ao aplicativo.
As classes Base do POS para .NET (Ponto de Serviço para .NET) da Microsoft podem gerenciar todas essas tarefas para o desenvolvedor. Para cada método de saída, a classe Base tem um método auxiliar associado. Esses métodos, que terminam com o sufixo Impl, são escritos como se fossem simplesmente a implementação síncrona de seu método pai. A classe Base gerencia uma fila de forma transparente, envia solicitações para funções Impl no momento e ordem certos e gera os eventos apropriados de volta para o aplicativo. Esse mesmo método é chamado para operações síncronas e assíncronas.
Ao derivar de uma classe Base do POS para .NET, o Objeto de Serviço obtém a funcionalidade assíncrona sem implementar um código adicional.
Implementação da classe Base
O POS para .NET fornece classes Base para um subconjunto de tipos de dispositivo do POS. Para cada método de saída nessas classes, há um método correspondente com um sufixo Impl. O Objeto de Serviço derivado de uma classe Base deve substituir somente o método Impl e não o método pai correspondente. Por exemplo, em uma classe derivada de PosPrinterBase da classe Base do POS para .NET, o Objeto de Serviço forneceria uma implementação para PrintNormalImpl e não substituiria PrintNormal.
As classes Base do POS para .NET implementam todos os métodos de saída e executam as seguintes tarefas para dar suporte ao método Impl implementado pelo Objeto de Serviço:
- Validar argumentos.
- Se a propriedade AsyncMode for false, o método Impl correspondente será chamado imediatamente.
- Se a propriedade AsyncMode estiver definida como true:
- A solicitação será colocada em uma fila. Essa fila pertence ao POS para .NET e é gerenciada por seu próprio thread.
- As solicitações na fila serão examinadas pelo thread da fila, e o método Impl correspondente será chamado. Essa chamada poderá atrasar caso o dispositivo já esteja processando uma solicitação de saída ou caso haja uma solicitação de prioridade mais alta na fila.
- Quando o método Impl é retornado, o código de classe Base do POS para .NET trata de todos os resultados. Para uma chamada síncrona, o método pode tanto retornar um valor quanto gerar uma exceção. Para uma chamada assíncrona, o método pode gerar eventos OutputCompleteEvent ou ErrorEvent de volta para o aplicativo.
- Métodos Impl também podem retornar um objeto que contém não apenas informações de erro, como valores de estatísticas também.
Métodos Impl do Objeto de Serviço
Como a maioria do processamento é tratada pelo código de classe Base, o método Impl do Objeto de Serviço pode ser relativamente simples.
Em vários casos, o estado do dispositivo no momento da chamada original é exigido pelo método Impl. Nessas situações, o código de classe Base salva o estado atual do dispositivo junto com a solicitação de saída. O estado do dispositivo é enviado posteriormente como um argumento para o método Impl. Por exemplo, a definição de PrintNormalImpl é:
protected override PrintResults PrintNormalImpl(
PrinterStation station,
PrinterState printerState,
string data);
O argumento printerState acima é específico para o método Impl e não existe na definição PrintNormal(PrinterStation, String).
O valor retornado das funções Impl também difere dos seus métodos de chamada. Por exemplo, observe que o método PrintNormalImpl retorna uma classe tipo PrintResults. Além de ErrorCode, ErrorCodeExtended, ErrorLevel e ErrorString, há várias propriedades adicionais que serão usadas pelo método de chamada para atualizar as contagens de estatísticas.
Exemplo
O exemplo a seguir demonstra como esses métodos são implementados no código do Objeto de Serviço.
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;
}