PosPrinter для .net Печать только один раз и зависание

Я создаю приложение winforms .net, у меня есть принтер E-Pos в сети, используя этот код ниже: При инициализации принтера загрузки формы:

    explorer = new PosExplorer(this);
        DeviceInfo receiptPrinterDevice = explorer.GetDevice("PosPrinter", Properties.Settings.Default.KitchenPrinter); //May need to change this if you don't use a logicial name or use a different one.
        kitchenPrinter = (PosPrinter)explorer.CreateInstance(receiptPrinterDevice);
       ConnectToPrinter();


    private void ConnectToPrinter()
    {  
        kitchenPrinter.Open();
        kitchenPrinter.Claim(10000);
        kitchenPrinter.DeviceEnabled = true;
     }

Вызов функции на кнопке печати:

 private void PrintReceipt()
    {

         try
            {  kitchenPrinter.PrintNormal(PrinterStation.Receipt, "test");
              }
            finally
            {

            }
    }

Когда я хочу переключиться на другую форму, я вызываю функцию отключения

        DisconnectFromPrinter(kitchenPrinter);
        Reporting frm = new Reporting(curuser);
        frm.Show();
        this.Hide();


  private void DisconnectFromPrinter(PosPrinter kitchenPrinter)
    {

        try
        {
           kitchenPrinter.Release();
            kitchenPrinter.Close();
        }
       catch { }
    }

Один раз печатается успешно, при следующем нажатии на печать выдается исключение
Метод ClaimDevice выдает исключение. Была предпринята попытка выполнить недопустимую или неподдерживаемую операцию с устройством, либо было использовано недопустимое значение параметра.

любое предложение ?


person Tamer Hatoum    schedule 03.03.2017    source источник
comment
не могли бы вы повторить попытку без задания DeviceEnabled = false? связанные: stackoverflow.com/questions/22430995/cant-claim-the- постпринтер; doc social.msdn.microsoft.com/Forums/en-US/ (устройства могут быть общими)   -  person Cee McSharpface    schedule 03.03.2017
comment
выпуск подразумевает отключение. закрыть подразумевает освобождение. код кажется правильным, может быть проблема с драйвером/устройством.   -  person Cee McSharpface    schedule 03.03.2017
comment
я пытаюсь открыть, потребовать, включить в форме загрузку из-за нажатия кнопки и много раз печатать при нажатии кнопки и отпускать ее при переключении на другую форму. но как только я возвращаюсь в свою форму, он снова зависает. так что кажется, что функция освобождения не работает хорошо ??   -  person Tamer Hatoum    schedule 03.03.2017
comment
да это может быть. к сожалению Release недействителен... нет информации об успешности операции. зависание = исключение, упомянутое в вашем посте? не могли бы вы обновить код, чтобы мы увидели общую картину, включая взаимодействие формы/кнопки?   -  person Cee McSharpface    schedule 03.03.2017
comment
зависание да означает упомянутое выше исключение.. вопрос был отредактирован   -  person Tamer Hatoum    schedule 03.03.2017
comment
прикрепите отладчик и докажите, что ConnectToPrinter вызывается после DisconnectFromPrinter и перед последующими PrintReceipt   -  person Cee McSharpface    schedule 03.03.2017
comment
Да, я проверил, и меня, вероятно, назвали. как вы думаете, это значение параметра претензии (10000)?   -  person Tamer Hatoum    schedule 03.03.2017
comment
Вам придется снова вызвать CreateInstance(). Вызов Close() был плохой идеей, просто не делайте этого. Если вы хотите печатать и из других форм, просто объявите kitchenPrinter статическим.   -  person Hans Passant    schedule 03.03.2017
comment
поскольку форма загружается, это означает, что создается новый экземпляр. То, что вы говорите, не имеет смысла   -  person Tamer Hatoum    schedule 03.03.2017


Ответы (1)


Поскольку команда Release неэффективна, и команда may Claim выдает ошибку каждый раз, когда я загружаю свою форму, потому что она была заявлена ​​​​ранее.

Итак, я создал отдельный класс под названием «createPOS».

         class createPOS
{
 public  static PosExplorer explorer;
  public  static PosPrinter kitchenPrinter;
  public static void createPos()
  {
      explorer = new PosExplorer();
      DeviceInfo receiptPrinterDevice = explorer.GetDevice("PosPrinter", Properties.Settings.Default.KitchenPrinter); //May need to change this if you don't use a logicial name or use a different one.
      kitchenPrinter = (PosPrinter)explorer.CreateInstance(receiptPrinterDevice);
      kitchenPrinter.Open();
      kitchenPrinter.Claim(10000);
      kitchenPrinter.DeviceEnabled = true;
  }
      public static void Print(string text){
          if (kitchenPrinter.Claimed)
              PrintTextLine(kitchenPrinter, text);  // kitchenPrinter.PrintNormal(PrinterStation.Receipt, text ); //Print text, then a new line character.
       }
      private static void PrintTextLine(PosPrinter printer, string text)
      {
          if (text.Length < printer.RecLineChars)
              printer.PrintNormal(PrinterStation.Receipt, text + Environment.NewLine); //Print text, then a new line character.
          else if (text.Length > printer.RecLineChars)
              printer.PrintNormal(PrinterStation.Receipt, TruncateAt(text, printer.RecLineChars)); //Print exactly as many characters as the printer allows, truncating the rest, no new line character (printer will probably auto-feed for us)
          else if (text.Length == printer.RecLineChars)
              printer.PrintNormal(PrinterStation.Receipt, text + Environment.NewLine); //Print text, no new line character, printer will probably auto-feed for us.
      }
      private static string TruncateAt(string text, int maxWidth)
      {
          string retVal = text;
          if (text.Length > maxWidth)
              retVal = text.Substring(0, maxWidth);

          return retVal;
      }
  }

и в форме входа в систему, что он будет доступен только после того, как я инициализирую свой принтер.

     createPOS.createPos();

и на MainForm я назвал метод печати:

        createPOS.Print("This allows me to Print Several times");

таким образом я могу печатать несколько раз, и даже я перехожу к другим формам и возвращаюсь, и все работает нормально.

Спасибо вам, ребята.

person Tamer Hatoum    schedule 03.03.2017
comment
Какой документации или проекту вы следовали, чтобы получить этот код? Я не уверен, должны ли вы запрашивать устройство каждый раз, когда собираетесь его использовать, или все время работы приложения. Я всегда получаю исключение, когда заявляю. - person Dzyann; 03.06.2021