Windows服务在运行第一个记录后关闭

本文关键字:记录 第一个 服务 运行 Windows | 更新日期: 2023-09-27 18:16:28

我有一个windows服务,它应该检查记录,通过电子邮件发送该记录的报告,删除记录,然后重复表。它检查记录,为第一个记录发送一份报告,然后关闭。有什么想法?

服务代码:

namespace ReportSender
{
    public partial class EmailReportService : ServiceBase
    {
        private EmailReportApp _app = new EmailReportApp();
        public Timer serviceTimer = new Timer();

        public EmailReportService()
        {
            InitializeComponent();
        }
        protected override void OnStart(string[] args)
        {
            //Set interval (from App Settings) and enable timer 
            serviceTimer.Elapsed += new ElapsedEventHandler(ServiceTimer_OnElapsed);
            //Use Conversion utility to determine next start date/time based on properties, use DateTime.Subtract() to find milliseconds difference between Now and the next start time 
            //serviceTimer.Interval = Date.AddInterval(Properties.Settings.Default.IntervalType, Properties.Settings.Default.Interval).Subtract(DateTime.Now).TotalMilliseconds;
            serviceTimer.Interval = 600000;
            serviceTimer.Enabled = true;
        }
        protected override void OnStop()
        {
            //Stop and disable timer 
            serviceTimer.Enabled = false;
        }
        private void ServiceTimer_OnElapsed(object source, ElapsedEventArgs e)
        {
            try
            {
                //Stop the timer to prevent overlapping runs 
                serviceTimer.Stop();
                //Start service 
                //Run your app.Start() code 
                _app = new EmailReportApp();
                _app.Start();


            }
            catch (Exception ex)
            {
            }
            finally
            {
                //Re-start the timer 
                serviceTimer.Start();
            }
        }
    }
}

服务应该执行的代码:

namespace ReportSender
{
    class EmailReportApp
    {
        // Private fields
        private Thread _thread;
        private EventLog _log;

        private void Execute()
        {
            try
            {
                    // Check for a new record
                    DataClasses1DataContext dc = new DataClasses1DataContext();
                    foreach (var item in dc.reportsSent1s)
                    {
                        string matchedCaseNumber = item.CaseNumberKey;
                        (new MyReportRenderer()).RenderTest(matchedCaseNumber);
                        dc.reportsSent1s.DeleteOnSubmit(item);
                        dc.SubmitChanges();
                    }

            }
            catch (ThreadAbortException ex)
            {
                _log.WriteEntry(ex.StackTrace.ToString());
                }
            }

        public void Start()
        {
            if (!EventLog.SourceExists("EventLoggerSource"))
                EventLog.CreateEventSource("EventLoggerSource", "Event Logger");
            _log = new EventLog("EventLoggerSource");
            _log.Source = "EventLoggerSource";
            _thread = new Thread(new ThreadStart(Execute));
            _thread.Start();
        }
        public void Stop()
        {
            if (_thread != null)
            {
                _thread.Abort();
                _thread.Join();
            }
        }
    }

    public class MyReportRenderer
    {
        private rs2005.ReportingService2005 rs;
        private rs2005Execution.ReportExecutionService rsExec;

        public void RenderTest(String matchedCaseNumber)
        {
            string HistoryID = null;
            string deviceInfo = null;
            string encoding = String.Empty;
            string mimeType = String.Empty;
            string extension = String.Empty;
            rs2005Execution.Warning[] warnings = null;
            string[] streamIDs = null;
            rs = new rs2005.ReportingService2005();
            rsExec = new rs2005Execution.ReportExecutionService();
            rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
            rsExec.Credentials = System.Net.CredentialCache.DefaultCredentials;
            rs.Url = "http://***.**.***.**/ReportServer_DEVELOPMENT/ReportService2005.asmx";
            rsExec.Url = "http://***.**.***.**/ReportServer_DEVELOPMENT/ReportExecution2005.asmx";

            try
            {
                // Load the selected report.
                rsExec.LoadReport("/LawDept/LawDeptTIC", HistoryID);
                // Set the parameters for the report needed.
                rs2005Execution.ParameterValue[] parameters = new rs2005Execution.ParameterValue[1];
                parameters[0] = new rs2005Execution.ParameterValue();
                parameters[0].Name = "CaseNumberKey";
                parameters[0].Value = matchedCaseNumber;
                rsExec.SetExecutionParameters(parameters, "en-us");
                // get pdf of report 
                Byte[] results = rsExec.Render("PDF", deviceInfo,
                out extension, out encoding,
                out mimeType, out warnings, out streamIDs);
                //pass paramaters for email
                DataClasses1DataContext db = new DataClasses1DataContext();

                var matchedBRT = (from c in db.GetTable<vw_ProductClientInfo>()
                                  where c.CaseNumberKey == matchedCaseNumber
                                  select c.BRTNumber).SingleOrDefault();
                var matchedAdd = (from c in db.GetTable<vw_ProductClientInfo>()
                                  where c.CaseNumberKey == matchedCaseNumber
                                  select c.Premises).SingleOrDefault();

                //send email with attachment
                MailMessage message = new MailMessage("234@acmetaxabstracts.com", "georr@gmail.com", "Report for BRT # " + matchedAdd, "Attached if the Tax Information Certificate for the aboved captioned BRT Number");
                MailAddress copy = new MailAddress("a123s@gmail.com");
                message.CC.Add(copy);
                SmtpClient emailClient = new SmtpClient("***.**.***.**");
                message.Attachments.Add(new Attachment(new MemoryStream(results), String.Format("{0}" + matchedBRT + ".pdf", "BRT")));
                emailClient.Send(message);

            }
            catch (Exception ex)
            {

            }
        }
    }
}

Windows服务在运行第一个记录后关闭

一旦OnStart方法被调用,'ServiceBase'将失去作用域。'ManualResetEvent'将为您保持服务打开。

使用成员:

ManualResetEvent stop = new ManualResetEvent(false);

在你的主程序中试试Start():

do
{
    try
    {
         _app = new EmailReportApp();
         _app.Start();
    }
    catch(Exception e)
    {
        ... handle error or log however you want
    }
}
while(!stop.WaitOne(0, false))
在Stop()中,确保stop.Set()