public async Task PrintAsync(DiscoveredPrinter printer, string message) { Connection connection = null; bool linePrintEnabled = false; try { await Task.Factory.StartNew(() => { connection = ConnectionCreator.Create(printer); connection.Open(); string originalPrinterLanguage = SGD.GET(DeviceLanguagesSgd, connection); linePrintEnabled = "line_print".Equals(originalPrinterLanguage, StringComparison.OrdinalIgnoreCase); if (linePrintEnabled) { SGD.SET(DeviceLanguagesSgd, "zpl", connection); } ZebraPrinter zebraPrinter = ZebraPrinterFactory.GetInstance(connection); ZebraPrinterLinkOs linkOsPrinter = ZebraPrinterFactory.CreateLinkOsPrinter(zebraPrinter); string errorMessage = GetPrinterStatusErrorMessage(zebraPrinter.GetCurrentStatus()); if (errorMessage != null) { throw new PrinterNotReadyException($"{errorMessage}. Please check your printer and try again."); } else { connection.Write(Encoding.UTF8.GetBytes(message)); } }); if (linePrintEnabled) { await ResetPrinterLanguageToLinePrintAsync(connection); } } catch (PrinterNotReadyException e) { if (linePrintEnabled) { await ResetPrinterLanguageToLinePrintAsync(connection); } throw new Exception(e.Message); } catch (Exception e) { if (linePrintEnabled) { await ResetPrinterLanguageToLinePrintAsync(connection); } throw new Exception(e.Message); } finally { await Task.Factory.StartNew(() => { try { connection?.Close(); } catch (ConnectionException) { } }); } }