C#Windows服务没有工作要做

时间:2011-04-13 12:46:23

标签: c# .net windows-services

我创建了一个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(String source,String machineName,Boolean readOnly)    在System.Diagnostics.EventLog.SourceExists(String source,String machineName)    在System.Diagnostics.EventLog.SourceExists(String source)

2 个答案:

答案 0 :(得分:6)

您需要启动前景线程以防止进程退出。

这只能通过创建新的线程来实现。 A Timer作为后台线程。请参阅下面的更新!

请在此处查看我的回答:

Best use of Windows Service for repeating a program call


这是非常简单方法:

public partial class EmailService : ServiceBase
{
    Thread _thread = new Thread(DoAlways)


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

     private void DoAlways()
     {
        while()
        {
           // ...
        }
     }

更新

类型Timer

System.Timers.Timer使用System.Threading.Timer,后者又使用原生WIN32计时器。

我确实在我的机器(XP)上编译和安装了你的服务,它只是起作用了。服务开始没有问题。我建议您对 interval 值进行硬编码以查看它是否有效,因为我怀疑它的值为零,因此计时器从未初始化。

答案 1 :(得分:2)

查看系统事件日志(事件查看器)。我确定发生了一些错误,这就是您的服务自动停止的原因。

可能的问题是您的服务无法找到您的app.config(请确保它的名称为yoursvcname.exe.config)。为了测试,请尝试将配置文件放在" C:\ WINDOWS \ system32 \"。

修改

通过查看您的事件日志错误,我认为您尝试从代码中访问事件日志,并且您没有所需权限或由于某种原因无法访问指定的事件日志源。

编辑2

或者看看这个答案:System.Security.SecurityException when writing to Event Log

(在EventLog / Security密钥上授予NetworkService读取权限)