2016-05-26 12 views
0

私はPosの.NETを使用するアプリケーションを作成していますが、WaitForDrawerCloseを呼び出すと領収書が返されるまで印刷できないことに気付いています。WaitForDrawerCloseブロックの印刷

これは望ましい動作ではありません。現金引き出しがプリンタをブロックすることなく閉じるのを待つもう1つの方法はありますか?

私は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); 
    } 
} 

答えて

0

、私がやったことは、本質的にこのでした:代わりに(WaitForClose)を使用して、私はちょうどこのようにそれをポーリング:

 for (var i = 0; i < 15; i++) 
     { 
      cashDrawer = GetCashDrawer(posExplorer); 
      cashDrawer.Open(); 
      cashDrawer.Claim(1000); 
      cashDrawer.DeviceEnabled = true; 
      if (!cashDrawer.DrawerOpened) 
      { 
       Console.WriteLine("waited"); 
       return; 
      }      
      cashDrawer.Release(); 
      cashDrawer.Close(); 
      System.Threading.Thread.Sleep(1500); 
     } 
     Console.WriteLine("timed out"); 

それは、理想的ではありませんそれでもプリンタをロックしないので、今のところそれをする必要があります。