2016-05-26 4 views
0

Ich schreibe eine Anwendung, die Pos für .Net verwendet, und ich merke, dass Sie, wenn Sie WaitForDrawerClose aufrufen, nicht in der Lage sein werden, Quittungen zu drucken, bis es zurückgegeben wird.WaitForDrawerClose blockiert Drucken

Dies ist kein wünschenswertes Verhalten. Gibt es eine andere Möglichkeit, auf das Schließen der Kassenlade zu warten, ohne den Drucker zu blockieren?

Ich habe in die OnDrawerStateChanged Event untersucht, aber das ist ein geschütztes Mitglied von CashDrawerBase, und ich bin mir nicht ganz sicher, wie Sie darauf zugreifen.

Hier ist meine 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); 
    } 
} 

Antwort

0

so, was ich tat, war im Wesentlichen das: Statt der Verwendung (WaitForClose), habe ich es genau wie diese Umfrage:

 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"); 

Es ist nicht ideal, aber es sperrt den Drucker auch nicht, also muss es für jetzt sein.