Delen via


Impl-methoden gebruiken voor synchrone of asynchrone uitvoer (POS voor .NET v1.14 SDK-documentatie)

Sommige POS-apparaattypen ondersteunen afgedrukte of weergegeven uitvoer, bijvoorbeeld de PosPrinter of LineDisplay. Serviceobjecten die zijn geschreven voor apparaten met uitvoer moeten ondersteuning bieden voor zowel asynchrone als synchrone uitvoer.

Een toepassing die een bewerking asynchroon uitvoert, stelt de eigenschap AsyncMode van het serviceobject in op true voordat de gewenste uitvoermethode wordt aangeroepen. Het serviceobject kan een uitzondering genereren als de aanvraag asynchroon niet kan worden verwerkt, maar dit is niet ideaal omdat het het bereik van toepassingen beperkt die mogelijk gebruikmaken van dat specifieke serviceobject.

Het ondersteunen van asynchrone uitvoer kan echter aanvullende en mogelijk gecompliceerde code vereisen. Met deze code wordt een wachtrij met binnenkomende aanvragen beheerd, een thread onderhouden om de wachtrij- en verzendaanvragen in de juiste volgorde te bewaken en gebeurtenissen terug te sturen naar de toepassing.

De Basisklassen Microsoft Point of Service voor .NET (POS voor .NET) kunnen al deze taken voor de ontwikkelaar beheren. Voor elke uitvoermethode heeft de Basisklasse een helpermethode die aan elke uitvoermethode is gekoppeld. Deze methoden, die eindigen op het Impl-achtervoegsel , worden geschreven alsof ze gewoon de synchrone implementatie van hun bovenliggende methode waren. De Basisklasse beheert transparant een wachtrij, verzendt aanvragen naar de Impl-functies op het juiste moment in de juiste volgorde en brengt de juiste gebeurtenissen terug naar de toepassing. Dezelfde methode wordt aangeroepen voor zowel synchrone als asynchrone bewerkingen.

Door afgeleid te zijn van een POS voor .NET Base-klasse , krijgt het serviceobject asynchrone functionaliteit zonder extra code te implementeren.

Basisklasse-implementatie

POS voor .NET biedt basisklassen voor een subset van POS-apparaattypen. Voor elke uitvoermethode in deze klassen is er een bijbehorende methode met een Impl-achtervoegsel . Het serviceobject dat is afgeleid van een basisklasse moet alleen de Impl-methode overschrijven en niet de bijbehorende bovenliggende methode. In een klasse die is afgeleid van de POS voor .NET Base-klassePosPrinterBase, zou het serviceobject bijvoorbeeld een implementatie voor PrintNormalImpl bieden en printNormalal niet overschrijven.

De POS voor .NET Base-klassen implementeren alle uitvoermethoden en voeren de volgende taken uit om de Impl-methode te ondersteunen die door het serviceobject is geïmplementeerd:

  • Argumenten valideren.
  • Als de eigenschap AsyncMode onwaar is, wordt de bijbehorende Impl-methode onmiddellijk aangeroepen.
  • Als de eigenschap AsyncMode is ingesteld op true:
    1. De aanvraag wordt in een wachtrij geplaatst. Deze wachtrij is eigendom van POS voor .NET en wordt beheerd door een eigen thread.
    2. Aanvragen in de wachtrij worden onderzocht door de thread van de wachtrij en de bijbehorende Impl-methode wordt aangeroepen. Deze aanroep kan worden vertraagd als het apparaat al een uitvoeraanvraag verwerkt of als er een aanvraag met een hogere prioriteit in de wachtrij bestaat.
  • Wanneer de Impl-methode wordt geretourneerd, verwerkt de POS voor .NET Base-klassecode alle resultaten. Voor een synchrone aanroep kan de methode een waarde retourneren of een uitzondering genereren. Voor een asynchrone aanroep kan de methode outputCompleteEvent- of ErrorEvent-gebeurtenissen weer naar de toepassing genereren.
  • Impl-methoden kunnen ook een object retourneren dat niet alleen foutinformatie bevat, maar ook statistiekenwaarden.

Impl-methoden voor serviceobjecten

Omdat de meeste verwerking wordt verwerkt door de basisklassecode, kan de Impl-methode van het serviceobject relatief eenvoudig zijn.

In veel gevallen is de status van het apparaat op het moment van de oorspronkelijke aanroep vereist door de Impl-methode . In deze situaties wordt met de basisklassecode de huidige apparaatstatus samen met de uitvoeraanvraag opgeslagen. De apparaatstatus wordt later verzonden als een argument naar de Impl-methode . De definitie voor PrintNormalImpl is bijvoorbeeld:

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

Het bovenstaande argument printerState is specifiek voor de methode Impl en bestaat niet in de PrintNormal(PrinterStation, String) definitie.

De retourwaarde van Impl-functies verschilt ook van de aanroepende methoden. Houd er bijvoorbeeld rekening mee dat de methode PrintNormalImpl een klasse van het type PrintResultsretourneert. Naast ErrorCode, ErrorCodeExtended, ErrorLevel en ErrorString zijn er een aantal extra eigenschappen die door de aanroepende methode worden gebruikt om het aantal statistieken bij te werken.

Opmerking

In het volgende voorbeeld ziet u hoe deze methoden worden geïmplementeerd in serviceobjectcode.

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

Zie ook

Opdrachten

Verwijzing

Concepten

Meer informatie