轮询服务 - C#

本文关键字:服务 | 更新日期: 2023-09-27 17:56:29

没有人能帮我吗?

我正在创建一个 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);
        }
    }
}

轮询服务 - C#

另一种方法是等待事件而不是使用计时器。

    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();
        }
    }

Set Timer.AutoReset = true。 否则,它只会完成一次工作。 但最好在 Windows 服务中使用线程。

[编辑]啊,是的。默认情况下,自动重置为 true。我也把它放在我的代码中:气相色谱。保持活力( 我的计时器 );因此,如果 GC 处于非活动状态,则不会将其删除。