0

Pos for .Net を使用するアプリケーションを作成しています。WaitForDrawerClose を呼び出すと、返されるまで領収書を印刷できないことに気付きました。

これは望ましくない動作です。プリンターをブロックせずにキャッシュ ドロワーが閉じるのを待つ別の方法はありますか?

OnDrawerStateChanged Eventを調べましたが、これはCashDrawerBase の保護されたメンバーであり、アクセス方法が完全にはわかりません。

これが私のSSCCEです:

static void Main(string[] args)
{
    var posExplorer = new PosExplorer();
    var waitTask = WaitForCloseAsync(posExplorer);
    System.Threading.Thread.Sleep(500);
    PrintText(posExplorer);
    waitTask.Wait();
}

public static Task WaitForCloseAsync(PosExplorer posExplorer)
{
    var result = Task.Factory.StartNew(() =>
    {
        Console.WriteLine("waiting");
        var cashDrawer = GetCashDrawer(posExplorer);
        cashDrawer.Open();
        cashDrawer.Claim(1000);
        cashDrawer.DeviceEnabled = true;
        cashDrawer.WaitForDrawerClose(10000, 4000, 500, 5000);
        cashDrawer.Release();
        cashDrawer.Close();
        Console.WriteLine("waited");
    });
    return result;
}

public static void PrintText(PosExplorer posExplorer)
{
    Console.WriteLine("printing");
    var printer = GetPosPrinter(posExplorer);
    printer.Open();
    printer.Claim(1000);
    printer.DeviceEnabled = true;
    var text = "abc\x1B|1lF";
    printer.PrintNormal(PrinterStation.Receipt, text);
    printer.Release();
    printer.Close();
    Console.WriteLine("printed");
}

public static CashDrawer GetCashDrawer(PosExplorer posExplorer)
{
    var deviceInfo = posExplorer.GetDevices(DeviceCompatibilities.Opos)
        .Cast<DeviceInfo>()
        .Where(d => d.Type == "CashDrawer")
        .ToList();

    var device = deviceInfo.FirstOrDefault(d => d.Compatibility == DeviceCompatibilities.Opos);

    if (device == null)
    {
        return null;
    }
    else
        return (CashDrawer)posExplorer.CreateInstance(device);
}

private static PosPrinter GetPosPrinter(PosExplorer posExplorer)
{
    var deviceInfo = posExplorer.GetDevices(DeviceCompatibilities.Opos)
        .Cast<DeviceInfo>()
        .Where(d => d.Type == "PosPrinter")
        .ToList();

    var device = deviceInfo.FirstOrDefault(d => d.Compatibility == DeviceCompatibilities.Opos);

    if (device == null)
    {
        return null;
    }
    else
    {
        return (PosPrinter)posExplorer.CreateInstance(device);
    }
}
4

1 に答える 1