Hi
I created a Windows Service which runs perfect when I run the code from a console app but I doesn't work when it runs in the windows service:
I can see that it line is not executed:
foreach (var item in pendientes)
My complete code:
using Microsoft.Reporting.WinForms; using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Diagnostics; using System.IO; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; using System.Timers; using System.Drawing.Imaging; using System.Drawing.Printing; using System.Windows.Forms; using System.Drawing; using CajaWebTCC.ServicioComprobante02.Agente; using CajaWebTCC.ServicioComprobante02.ServicioComprobante02; using System.Net; using CajaWebTCC.ServicioComprobante02.Impresion; namespace CajaWebTCC.ServicioComprobante02 { public partial class ServicioComprobanteViewer : ServiceBase { private readonly int _intervalo; private System.Timers.Timer _timer; private EstadoServicio _estadoServicio; private readonly EventLog _log; private readonly bool _logHabilitado; private int m_currentPageIndex; private IList<Stream> m_streams; public ServicioComprobanteViewer() { InitializeComponent(); var logSource = ConfigurationManager.AppSettings["LogSource"]; var logName = ConfigurationManager.AppSettings["LogName"]; var inter = ConfigurationManager.AppSettings["Intervalo"]; _logHabilitado = Boolean.Parse(ConfigurationManager.AppSettings["LogHabilitado"]); _intervalo = Int32.Parse(inter); if (_logHabilitado) _log = new EventLog { Source = logSource, Log = logName }; } #region timer void timer_Elapsed(object sender, ElapsedEventArgs e) { if (_estadoServicio != EstadoServicio.Esperando) return; _estadoServicio = EstadoServicio.Procesando; _log.WriteEntry("Se lanza proceso"); ProcesarImpresion(); _log.WriteEntry("fin proceso"); _estadoServicio = EstadoServicio.Esperando; } #endregion #region Events Interface protected override void OnStart(string[] args) { //Configuracion del Timer if (_timer == null) _timer = new System.Timers.Timer(); _timer.AutoReset = true; _timer.Interval = _intervalo * 1000; _timer.Elapsed += timer_Elapsed; _estadoServicio = EstadoServicio.Procesando; _timer.Start(); //ProcesarImpresion(); _estadoServicio = EstadoServicio.Esperando; //Registros del log if (_logHabilitado) _log.WriteEntry("Se inicia el servicio de impresión con QR."); } protected override void OnStop() { _timer.Stop(); _timer.Elapsed -= timer_Elapsed; _timer = null; if (_logHabilitado) _log.WriteEntry("El servicio de impresión con QR se detuvo."); } #endregion private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) { Stream stream = new MemoryStream(); m_streams.Add(stream); return stream; } private void Export(LocalReport report) { const string deviceInfo = @"<DeviceInfo><OutputFormat>EMF</OutputFormat><PageWidth>10in</PageWidth><PageHeight>12in</PageHeight><MarginTop>0.1in</MarginTop><MarginLeft>0.1in</MarginLeft><MarginRight>0.1in</MarginRight><MarginBottom>0.1in</MarginBottom></DeviceInfo>"; Warning[] warnings; m_streams = new List<Stream>(); report.Render("Image", deviceInfo, CreateStream, out warnings); foreach (Stream stream in m_streams) stream.Position = 0; } private void PrintPage(object sender, PrintPageEventArgs ev) { var pageImage = new Metafile(m_streams[m_currentPageIndex]); // Adjust rectangular area with printer margins. var adjustedRect = new Rectangle( ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX, ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY, ev.PageBounds.Width, ev.PageBounds.Height); // Draw a white background for the report ev.Graphics.FillRectangle(Brushes.White, adjustedRect); // Draw the report content ev.Graphics.DrawImage(pageImage, adjustedRect); // Prepare for the next page. Make sure we haven't hit the end. m_currentPageIndex++; ev.HasMorePages = (m_currentPageIndex < m_streams.Count); } private void Print() { if (m_streams == null || m_streams.Count == 0) throw new Exception("Error: No hay stream que imprimir."); using (var printDoc = new PrintDocument()) { printDoc.PrinterSettings.PrinterName = ConfigurationManager.AppSettings["NombreImpresora"]; printDoc.PrintPage += new PrintPageEventHandler(PrintPage); m_currentPageIndex = 0; printDoc.Print(); } } public void ProcesarImpresion() { try { _log.WriteEntry("paso0"); var pendientes = AgenteServicioComprobante.ListarComprobantePendiente(new ComprobantePendienteEL { vch_CodigoEstacion = Dns.GetHostName() }); if (pendientes != null && pendientes.Any()) { _log.WriteEntry("paso01"); foreach (var item in pendientes) { var vchTextoComprobante = item.vch_TextoComprobante; byte[] bitsCodigoQr = null; if (!string.IsNullOrEmpty(item.vch_ImagenQR)) { var codigoQr = item.vch_ImagenQR; bitsCodigoQr = Convert.FromBase64String(codigoQr); } var ticket = new List<TicketQr> { new TicketQr { Comprobante = vchTextoComprobante, CodigoQr = string.IsNullOrEmpty(item.vch_ImagenQR) ? null : bitsCodigoQr } }; var report = new LocalReport { ReportPath = AppDomain.CurrentDomain.BaseDirectory + @"Impresion\ReporteQR.rdlc" }; report.DataSources.Add( new ReportDataSource("dsImpresionQr", ticket)); Export(report); Print(); AgenteServicioComprobante.ActualizarComprobantePendiente(new ComprobantePendienteEL { int_CodigoComprobantePendiente = item.int_CodigoComprobantePendiente }); System.Threading.Thread.Sleep(2000); } } } catch (Exception ex) { if (_logHabilitado) { _log.WriteEntry(ex.Message); _log.WriteEntry(ex.StackTrace); } } } } public enum EstadoServicio { Esperando = 0, Procesando = 1 } }
I seens that the app stop working. after:
if (pendientes != null && pendientes.Any())
{
_log.WriteEntry("paso01")