没有工作的C#Windows服务

问题描述

| 我已经创建了一个C#Windows服务,该服务应该发送一些电子邮件,但是当我启动该服务时,会收到消息“本地服务已启动,然后停止了”。。。做\' 为什么会这样呢?
namespace EmailService
{
public partial class EmailService : ServiceBase
{
    private System.Timers.Timer _timer = null;
    private DateTime _lastRun = DateTime.Now;
    private int _timerIntervalValue;

    public EmailService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {

        if (string.IsNullOrEmpty(ConfigurationManager.AppSettings[\"Timer\"]))
        {
            throw new Exception(\"The timer value is not set in the app.config.\");
        }
        else
        {
            _timerIntervalValue = Convert.ToInt32(ConfigurationManager.AppSettings[\"Timer\"]);
        }

        _timer = new System.Timers.Timer(_timerIntervalValue);
        _timer.Elapsed += OnTimedEvent;
        _timer.Interval = Convert.ToInt32(_timerIntervalValue);
        _timer.Enabled = true;

    }

    protected override void OnStop()
    {
        _timer.Stop();
        _timer.dispose();
    }

    private void OnTimedEvent(object source,ElapsedEventArgs e)
    {
        Email email = new Email();
        email.ProcessEmails();
        _lastRun = DateTime.Now;
        _timer.Start();
    }


}

}
事件日志条目 服务无法启动。 System.Security.SecurityException:找不到源,但是无法搜索某些或所有事件日志。不可访问的日志:安全性。    在System.Diagnostics.EventLog.FindSourceRegistration处(字符串源,字符串machineName,布尔值readOnly)    在System.Diagnostics.EventLog.sourceExists(字符串源,字符串machineName)    在System.Diagnostics.EventLog.sourceExists(字符串源)     

解决方法

您需要启动Foreground线程以防止进程退出。 这只能通过创建新的线程来实现。
Timer
作为后台线程。请参阅下面的更新! 在这里查看我的答案: 最佳使用Windows Service重复程序调用 这是一种非常简单的方法:
public partial class EmailService : ServiceBase
{
    Thread _thread = new Thread(DoAlways)


     protected override void OnStart(string[] args)
     {
        _thread.Start();
     }

     private void DoAlways()
     {
        while()
        {
           // ...
        }
     }
更新 类型
System.Timers.Timer
Timer
使用
System.Threading.Timer
,后者又使用本机WIN32计时器。 我确实在我的计算机(XP)上编译并安装了您的服务,并且它可以正常工作。服务开始没有问题。我建议您对时间间隔值进行硬编码,以查看其是否有效,因为我怀疑它的值为零,因此计时器从未初始化。     ,查看系统事件日志(事件查看器)。我确定发生了一些错误,这就是您的服务自动停止的原因。 可能的问题是您的服务找不到您的app.config(确保将其命名为yoursvcname.exe.config)。为了进行测试,请尝试将配置文件放在\“ C:\\ WINDOWS \\ system32 \\\”中。 编辑 通过查看事件日志错误,我认为您正在尝试从代码中访问事件日志,并且您没有必需的权限,或者由于某种原因无法访问指定的事件日志源。 编辑2 或看看以下答案:写入事件日志时出现System.Security.SecurityException (在EventLog / Security密钥上授予NetworkService读取权限)