0

我有一个 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)
            {


            }
        }
    }
}
4

1 回答 1

2

调用 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()

于 2013-05-31T14:09:02.030 回答