C # Служба Windows, у которой нет работы - PullRequest
3 голосов
/ 13 апреля 2011

Я создал службу Windows C #, которая должна отправлять некоторые электронные письма, но когда я запускаю службу, я получаю сообщение «служба запущена, а затем остановлена» ... «некоторые службы автоматически останавливаются, если у них нет работы.do '

Почему это так?

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 ]

6 голосов
/ 13 апреля 2011

Вам нужно запустить поток переднего плана , чтобы не допустить выхода из процесса.

Это достигается только созданием новой темы. A Timer работает как фоновая тема. См. Обновление ниже!

Смотрите мой ответ здесь:

Лучшее использование службы Windows для повторения вызова программы


Это ОЧЕНЬ ПРОСТОЙ подход:

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


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

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

UPDATE

Timer типа System.Timers.Timer использует System.Threading.Timer, который, в свою очередь, использует собственный таймер WIN32.

Я скомпилировал и установил ваш сервис на моей машине (XP), и он просто работал. Служба запущена без проблем. Я предлагаю вам жестко кодировать значение interval , чтобы посмотреть, работает ли оно, так как я подозреваю, что оно получает значение ноль, поэтому таймер никогда не инициализируется.

2 голосов
/ 13 апреля 2011

Загляните в системный журнал событий (Event Viewer).Я уверен, что произошла какая-то ошибка, и поэтому ваша служба автоматически остановилась.

Возможно, ваша служба не может найти ваш app.config (убедитесь, что он называется yoursvcname.exe.config).Для теста попытайтесь поместить ваш конфигурационный файл в «C: \ WINDOWS \ system32 \».

EDIT

Видя вашу ошибку в журнале событий, я думаю, что выпытаясь получить доступ к журналу событий из вашего кода, и у вас нет необходимых разрешений или указанный источник журнала событий по какой-то причине недоступен.

РЕДАКТИРОВАТЬ 2

Или принятьвзгляните на эти ответы: System.Security.SecurityException при записи в журнал событий

(дать разрешение NetworkService на чтение ключа EventLog / Security)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...