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