一部の POS デバイスの種類は、PosPrinter や LineDisplay などの印刷出力や表示出力をサポートします。 出力できるデバイスに書き込まれたサービス オブジェクトは、非同期出力と同期出力の両方をサポートする必要があります。
非同期で操作を実行するアプリケーションは、目的の出力メソッドを呼び出す前に、サービス オブジェクト の AsyncMode プロパティを true に設定します。 非同期で要求を処理できない場合、サービス オブジェクトは例外を表示する場合がありますが、その特定のサービス オブジェクトを使用する可能性があるアプリケーションのスコープを制限するため、これは理想的ではありません。
ただし、非同期出力をサポートするには、追加の複雑なコードが必要になる場合があります。 このコードは受信要求のキューを管理し、キューを監視し適切な順序で要求をディスパッチするためにでスレッドを維持し、アプリケーションにイベントを返します。
Microsoft Point of Service for .NET (POS for .NET) 基底クラスは、開発者のためにこれらのタスクをすべて管理できます。 出力メソッドごとに、基底クラスには各出力メソッドに関連付けられたヘルパー メソッドがあります。 Impl サフィックスで終わるこれらのメソッドは、単に親メソッドの同期実装であるかのように作成されます。 基底クラスはキューを透過的に管理し、適切な順序と適切なタイミングで Impl 関数に要求をディスパッチし、アプリケーションに適切なイベントを返します。 同期操作と非同期操作の両方に対してこの同じメソッドを呼び出します。
POS for .NET 基底クラスから派生することで、サービス オブジェクトは追加のコードを実装することなく非同期機能を実現します。
基底クラスの実装
POS for .NET には、POS デバイスの種類のサブセット用の基底クラスが用意されています。 これらのクラスの出力メソッドごとに、Impl サフィックスを持つ対応するメソッドがあります。 基底クラスから派生したサービス オブジェクトは、対応する親メソッドではなく Impl メソッドのみをオーバーライドする必要があります。 たとえば、POS for .NET 基底クラス PosPrinterBase から派生したクラスでは、サービス オブジェクトは PrintNormalImpl の実装を提供し、PrintNormal はオーバーライドしません。
POS for .NET 基底クラスはすべての出力メソッドを実装し、サービス オブジェクトによって実装される Impl メソッドをサポートするために次のタスクを実行します。
- 引数を検証します。
- AsyncMode プロパティが false の場合、対応する Impl メソッドを直ちに呼び出します。
- AsyncMode プロパティが true に設定されている場合:
- 要求をキューに配置します。 このキューは POS for .NET によって所有され、独自のスレッドによって管理されます。
- キューの要求をキューのスレッドによって検証し、対応する Impl メソッドを呼び出します。 デバイスが既に出力要求を処理している場合、またはキューに優先度のより高い要求が存在する場合、この呼び出しが遅延する可能性があります。
- Impl メソッドが返されると、POS for .NET 基底クラス コードはすべての結果を処理します。 同期呼び出しの場合、メソッドは値を返すか、例外を示すことがあります。 非同期呼び出しの場合、メソッドは OutputCompleteEvent イベントまたは ErrorEvent イベントをアプリケーションに戻すことがあります。
- Impl メソッドは、エラー情報だけでなく統計値も含むオブジェクトを返すこともあります。
サービス オブジェクトの Impl メソッド
ほとんどの処理は基底 クラス コードによって処理されるため、サービス オブジェクトの Impl メソッドは比較的簡単な場合があります。
多くの場合、Impl メソッドには元の呼び出し時のデバイスの状態が必要です。 このような状況では、基底クラス コードは出力要求と共に現在のデバイスの状態を保存します。 デバイスの状態は、後で Impl メソッドに引数として送信されます。 たとえば、PrintNormalImpl の定義は次のとおりです。
protected override PrintResults PrintNormalImpl(
PrinterStation station,
PrinterState printerState,
string data);
上記の引数 printerState は Impl メソッドに固有であり、PrintNormal(PrinterStation, String) 定義には存在しません。
また、Impl 関数の戻り値は呼び出し元のメソッドと異なります。 たとえば、PrintNormalImpl メソッドはタイプ PrintResults のクラスを返します。 ErrorCode、ErrorCodeExtended、ErrorLevel、ErrorString に加えて、統計カウントを更新するために呼び出し元のメソッドで使用される追加のプロパティがいくつかあります。
例
次の例では、これらのメソッドをサービス オブジェクト コードで実装する方法を示します。
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;
}
参照
タスク
リファレンス
概念
その他の参照情報
.NET