C# Windows服务在运行第一条记录后关闭

C# Windows服务在运行第一条记录后关闭,c#,windows-services,C#,Windows Services,我有一个windows服务,它应该检查一条记录,通过电子邮件发送该记录的报告,删除该记录,然后重复该表。它检查记录,通过电子邮件发送第一条记录的报告,然后关闭。有什么想法吗 服务代码: namespace ReportSender { public partial class EmailReportService : ServiceBase { private EmailReportApp _app = new EmailReportApp();

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


            }
        }
    }
}
namespace ReportSender
{
类EmailReportApp
{
//私人领域
私有线程(u线程),;
私有事件日志(private EventLog);
私有void Execute()
{
尝试
{
//检查新记录
DataClasses1DataContext dc=新DataClasses1DataContext();
foreach(dc.ReportsSet1s中的变量项)
{
字符串matchedCaseNumber=item.CaseNumberKey;
(新的MyReportRenderer()).RenderTest(匹配的案例编号);
dc.报告SSENT1S.删除提交(项目);
dc.提交更改();
}
}
捕获(线程异常异常)
{
_log.WriteEntry(例如StackTrace.ToString());
}
}
公开作废开始()
{
如果(!EventLog.SourceExists(“EventLoggerSource”))
CreateEventSource(“EventLoggerSource”、“事件记录器”);
_日志=新事件日志(“EventLoggerSource”);
_log.Source=“EventLoggerSource”;
_线程=新线程(新线程开始(执行));
_thread.Start();
}
公共停车场()
{
如果(_thread!=null)
{
_thread.Abort();
_thread.Join();
}
}
}
公共类MyReportRenderer
{
私人rs2005.ReportingService 2005 rs;
私有rs2005Execution.ReportExecutionService rsExec;
public void RenderTest(字符串匹配CaseNumber)
{
字符串HistoryID=null;
字符串deviceInfo=null;
字符串编码=string.Empty;
string mimeType=string.Empty;
字符串扩展名=string.Empty;
rs2005Execution.Warning[]warnings=null;
字符串[]streamIDs=null;
rs=新的rs2005.ReportingService2005();
rsExec=新的rs2005Execution.ReportExecutionService();
rs.Credentials=System.Net.CredentialCache.DefaultCredentials;
rsExec.Credentials=System.Net.CredentialCache.DefaultCredentials;
rs.Url=“http://****.*.*.*/ReportServer\u DEVELOPMENT/ReportService2005.asmx”;
rsExec.Url=“http://****.*.*.*/ReportServer\u DEVELOPMENT/ReportExecution2005.asmx”;
尝试
{
//加载所选报告。
rsExec.LoadReport(“/LawDept/LawDeptTIC”,HistoryID);
//设置所需报告的参数。
rs2005Execution.ParameterValue[]参数=新的rs2005Execution.ParameterValue[1];
参数[0]=新的rs2005Execution.ParameterValue();
参数[0]。Name=“CaseNumberKey”;
参数[0]。值=matchedCaseNumber;
rsExec.SetExecutionParameters(参数“en-us”);
//获取报告的pdf格式
Byte[]results=rsExec.Render(“PDF”,deviceInfo,
输出扩展,输出编码,
输出mimeType、输出警告、输出StreamID);
//为电子邮件传递参数
DataClasses1DataContext db=新DataClasses1DataContext();
var matchedBRT=(来自db.GetTable()中的c)
其中c.CaseNumberKey==匹配的CaseNumber
选择c.BRTNumber).SingleOrDefault();
var matchedAdd=(来自db.GetTable()中的c)
其中c.CaseNumberKey==匹配的CaseNumber
选择c.Premises).SingleOrDefault();
//发送带有附件的电子邮件
MailMessage=新的MailMessage(“234@acmetaxabstracts.com", "georr@gmail.com“,”BRT报告“+”匹配添加,“如果上述标题BRT编号的税务信息证书随附”);
邮件地址副本=新邮件地址(“a123s@gmail.com");
message.CC.Add(副本);
SmtpClient emailClient=新的SmtpClient(“***.*****.*”);
message.Attachments.Add(新的附件(新的MemoryStream(results),String.Format(“{0}”+matchedBRT+”.pdf,“BRT”));
emailClient.Send(message);
}
捕获(例外情况除外)
{
}
}
}
}

一旦调用OnStart方法,“ServiceBase”将失去作用域。“ManualReset事件”将为您打开服务

使用成员:

ManualResetEvent stop = new ManualResetEvent(false);
在主开始()中尝试以下操作:


在Stop()中,确保执行
Stop.Set()。java中有时会发生这种情况(请参阅)。@a_schimpf我确实使用了一个没有finally块的循环,以不同的方式运行了它,但它仍然做了同样的事情。提交报告并发送电子邮件后,在dc.reportsSent1s.DeleteOnSubmit(项目)之前关闭;dc.提交更改();已执行。嘿,Korrowan看起来仍然有问题,您是否曾经从代码的电子邮件部分输出任何try catch以确保那里没有发生任何事情?@Bearcat9425无论我在哪里尝试捕获错误,日志中都不会出现任何问题。捕获和接受异常有什么意义?如果代码不能正常工作,那么如果你不能得到任何异常,就更难找出原因。我加了一个“…”表示你可以把你想要的任何东西放到错误日志或日志中
do
{
    try
    {
         _app = new EmailReportApp();
         _app.Start();
    }
    catch(Exception e)
    {
        ... handle error or log however you want
    }
}
while(!stop.WaitOne(0, false))