非同步輸出範例 (POS for .NET v1.14 SDK 文件)
Microsoft Point of Service for .NET (POS for .NET) 會支援符合統一服務點 (UnifiedPOS) 規格的非同步輸出。 在非同步輸出模型中,服務物件必須將輸出要求排入佇列,以便將控制項儘快傳回應用程式。 接著,第二個執行緒必須將輸出分派至裝置,並在要求完成時通知應用程式,不論是使用 OutputCompleteEvent 或 ErrorEvent 事件。
POS for .NET 類別庫會處理服務物件開發人員的大部分函式,因此非同步輸出裝置與僅同步輸出裝置之間的差異很少。
建立專案
建立 Visual Studio 類別庫專案。
將下列範例程式碼新增至您的專案。
新增參考至 Microsoft.PointOfService 組件。
編譯服務物件,並將服務物件複製到服務物件元件載入路徑中的其中一個目錄。
若要搭配服務物件使用應用程式範例
- 此服務物件可以搭配事件處理常式範例中顯示的應用程式範例使用。
範例
若要輸出到 PosPrinter 裝置,應用程式最常使用 PrintNormal(PrinterStation, String) 方法。 請注意,下方的 PosPrinter 服務物件程式碼不提供此方法的實作。 會改為實作 PrintNormalImpl(PrinterStation, PrinterState, String)。 針對同步和非同步輸出要求,此方法由 POS for .NET 程式庫呼叫。
當應用程式呼叫輸出方法,例如 PrintNormal時,POS for .NET 實作會檢查 AsyncMode 屬性的值。 如果此值為 false,則 POS for .NET 程式庫會立即將要求傳送至 PrintNormalImpl ,並等候其傳回。 不過,如果值為 true,則 PrintNormal 實作的 POS for .NET 會將要求新增至內部管理的佇列。 當佇列中有專案時,POS for .NET 受控執行緒會藉由呼叫 PrintNormalImpl,在先進先出 (FIFO) 順序中,將每個要求傳送至裝置。 當 PrintNormalImpl 傳回時,程式庫實作會在應用程式中引發 OutputCompleteEvent。 簡單而言,相同的服務物件程式碼可以同時支援同步和非同步輸出,而無需知道正在使用哪一種輸出模式。
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
}
}
事件處理常式範例中的應用程式程式碼可以使用這個服務物件進行編譯和執行。