Служба опросов - C # - PullRequest
       32

Служба опросов - C #

3 голосов
/ 12 мая 2011

Кто-нибудь сможет мне помочь?

Я создаю службу Windows, которая подключается к базе данных sql, проверяет дату в таблице, сравнивает ее с текущей датой и обновляет поле в этой базе данных, например, если эта дата равна текущей дате, тогда поле будет установить в true.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю службу, она этого не делает, но когда я делаю это в нормальной форме, она отлично работает.

Мой код указан ниже:

//System.Timers
Timer timer = new Timer();
protected override void OnStart(string[] args)
{
    timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
    timer.Interval = 60000;
    timer.Enabled = true;
}

private void OnElapsedTime(object source, ElapsedEventArgs e)
{
    int campid = 0;
    var campRes = new ROS.Process.CampaignServiceController().GetCampainInfo();

    foreach (var s in campRes)
    {
        campid = s.CampaignId;

        if (s.CampEndDate.Date < DateTime.Today.Date)
        {
            //WriteDataToFile("Not Active : " + campid.ToString());
            new ROS.Process.CampaignServiceController().SetCampainStatusFalse(campid);
        }
        else
        {
            //WriteDataToFile("Active : " + campid.ToString());
            new ROS.Process.CampaignServiceController().SetCampainStatusTrue(campid);
        }
    }
}

Ответы [ 2 ]

10 голосов
/ 18 мая 2011

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

т.е.

    public class PollingService
    {
        private Thread _workerThread;
        private AutoResetEvent _finished;
        private const int _timeout = 60*1000;

        public void StartPolling()
        {
            _workerThread = new Thread(Poll);
            _finished = new AutoResetEvent(false);
            _workerThread.Start();
        }

        private void Poll()
        {
            while (!_finished.WaitOne(_timeout))
            {
                //do the task
            }
        }

        public void StopPolling()
        {
            _finished.Set();
            _workerThread.Join();
        }
    }

К вашим услугам

    public partial class Service1 : ServiceBase
    {
        private readonly PollingService _pollingService = new PollingService();
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            _pollingService.StartPolling();
        }

        protected override void OnStop()
        {
            _pollingService.StopPolling();
        }

    }
0 голосов
/ 12 мая 2011

Установить Timer.AutoReset = true.в противном случае он будет выполнять свою работу только один раз.но лучше работать с потоками в службах Windows.

[править] ах, да.автосброс имеет значение true по умолчанию.Я тоже поместил это в мой код: GC.KeepAlive (myTimer);так что gc не удалит его, если он неактивен.

...