다음을 통해 공유


동기 또는 비동기 출력에 Impl 메서드 사용(.NET용 POS v1.14 SDK 설명서)

일부 POS 디바이스 유형은 인쇄되거나 표시된 출력(예: PosPrinter 또는 LineDisplay)을 지원합니다. 출력 사용 디바이스에 대해 작성된 서비스 개체는 비동기 및 동기 출력을 모두 지원해야 합니다.

비동기적으로 작업을 수행하는 애플리케이션은 원하는 출력 메서드를 호출하기 전에 서비스 개체의 AsyncMode 속성을 true로 설정합니다. 서비스 개체는 요청을 비동기적으로 처리할 수 없는 경우 예외를 throw할 수 있지만 특정 서비스 개체를 사용할 수 있는 애플리케이션의 범위를 제한하므로 이상적이지 않습니다.

그러나 비동기 출력을 지원하려면 복잡한 코드가 추가로 필요할 수 있습니다. 이 코드는 들어오는 요청의 큐를 관리하고, 큐를 모니터링하며 요청을 적절한 순서로 디스패치하는 스레드를 유지 관리하며, 애플리케이션에 이벤트를 다시 발생시킵니다.

.NET용 Microsoft POS(POS for .NET) 기본 클래스는 개발자를 위해 이러한 모든 작업을 관리할 수 있습니다. 각 출력 메서드의 경우 Base 클래스에는 각각의 출력 메서드와 연결된 도우미 메서드가 있습니다. Impl 접미사로 끝나는 이러한 메서드는 단순히 부모 메서드의 동기 구현인 것처럼 작성됩니다. Base 클래스는 큐를 투명하게 관리하고, Impl 함수에 요청을 적절한 순서로 적절한 시간에 디스패치하고, 적절한 이벤트를 애플리케이션으로 다시 발생합니다. 동기 및 비동기 작업 모두에 대해 이 메서드가 똑같이 호출됩니다.

.NET용 POS 기본 클래스에서 파생하면 서비스 개체는 추가 코드를 구현하지 않고 비동기 기능을 가져옵니다.

Base 클래스 구현

.NET용 POS는 POS 디바이스 유형의 하위 집합에 대한 Base 클래스를 제공합니다. 이러한 클래스의 각 출력 메서드에는 Impl 접미사가 있는 해당 메서드가 있습니다. Base 클래스에서 파생된 서비스 개체는 해당 부모 메서드가 아닌 Impl 메서드만 재정의해야 합니다. 예를 들어 .NET Base 클래스 PosPrinterBase에 대한 POS에서 파생된 하나의 클래스에서 서비스 개체는 PrintNormalImpl에 대한 구현을 제공하며 PrintNormal을 재정의하지 않습니다.

.NET용 POS Base 클래스는 모든 출력 메서드를 구현하며 서비스 개체에서 구현된 Impl 메서드를 지원하기 위해 다음 작업을 수행합니다.

  • 인수의 유효성을 검사합니다.
  • AsyncMode 속성이 false이면 해당 Impl 메서드가 즉시 호출됩니다.
  • AsyncMode 속성이 true로 설정된 경우:
    1. 요청은 큐에 배치됩니다. 이 큐는 .NET용 POS에서 소유하며 자체 스레드에서 관리합니다.
    2. 큐에 대한 요청은 큐의 스레드에서 검사하며 해당 Impl 메서드가 호출됩니다. 디바이스가 이미 출력 요청을 처리하고 있거나 큐에 더 높은 우선 순위의 요청이 있다면 이 호출이 지연될 수 있습니다.
  • Impl 메서드가 반환되면 .NET Base 클래스 코드에 대한 POS가 모든 결과를 처리합니다. 동기 호출의 경우 메서드는 값을 반환하거나 예외를 throw할 수 있습니다. 비동기 호출의 경우 메서드는 OutputCompleteEvent 또는 ErrorEvent 이벤트를 애플리케이션으로 다시 발생시킬 수 있습니다.
  • Impl 메서드는 오류 정보뿐만 아니라 통계 값도 포함하는 개체를 반환할 수도 있습니다.

서비스 개체 Impl 메서드

대부분의 프로세스는 Base 클래스 코드에서 처리되므로 서비스 개체의 Impl 메서드는 비교적 간단할 수 있습니다.

대개의 경우 Impl 메서드에서 원래 호출 시 디바이스의 상태가 필요합니다. 이러한 경우 Base 클래스 코드는 출력 요청과 함께 현재 디바이스 상태를 저장합니다. 디바이스 상태는 나중에 Impl 메서드에 인수로 전송됩니다. 예를 들어 PrintNormalImpl에 대한 정의는 다음과 같습니다.

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

위의 printerState 인수는 Impl 메서드와 관련이 있으며 PrintNormal(PrinterStation, String) 정의에는 없습니다.

Impl 함수의 반환 값도 호출 메서드와 다릅니다. 예를 들어 PrintNormalImpl 메서드는 형식 PrintResults의 클래스를 반환합니다. ErrorCode, ErrorCodeExtended, ErrorLevelErrorString 외에도 호출 메서드에서 통계 수를 업데이트하는 데 사용할 추가 속성이 많이 있습니다.

다음 예제에서는 이러한 메서드가 Service Object 코드에서 구현되는 방법을 보여줍니다.

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

참고 항목

작업

참조

개념

기타 리소스