使用ManualResetEvent检查服务是否已完成处理

时间:2013-02-19 03:20:32

标签: .net c#-4.0 timer windows-services

我有一个Web服务,我需要确保完成处理然后在调用onstop()时退出。目前,当调用onstop()时,服务立即停止。我被告知要查看ManualResetEvent和一个requeststop标志。我到处寻找一些例子,甚至找到了其中一些:

How do I safely stop a C# .NET thread running in a Windows service?

To make a choice between ManualResetEvent or Thread.Sleep()

http://www.codeproject.com/Articles/19370/Windows-Services-Made-Simple

但是我很难理解哪一种最适合我的情况。

以下代码:

        System.Timers.Timer timer = new System.Timers.Timer();
        private volatile bool _requestStop = false;
        private static readonly string connStr = ConfigurationManager.ConnectionStrings["bedbankstandssConnectionString"].ConnectionString;
        private readonly ManualResetEvent _allDoneEvt = new ManualResetEvent(true);
        public InvService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            _requestStop = false;
            timer.Elapsed += timer_Elapsed;
            double pollingInterval = Convert.ToDouble(ConfigurationManager.AppSettings["PollingInterval"]);
            timer.Interval = pollingInterval;
            timer.Enabled = true;
            timer.Start();      
        }

        protected override void OnStop()
        {
            _requestStop = true;
            timer.Dispose();
        }

        protected override void OnContinue()
        { }

        protected override void OnPause()
        { }

        private void timer_Elapsed(object sender, EventArgs e)
        {
            if (!_requestStop)
            {
                timer.Start(); 
                InvProcessingChanges();     
            }               
        }

        private void InvProcessingChanges()
        { 
           //Processes changes to inventory
        }

有没有人有经验可以帮助我的Windows服务? 刚刚完成我的第一次工作服务,我对Windows服务很陌生。此服务需要在实际停止之前完成发送库存更新。

1 个答案:

答案 0 :(得分:3)

您使用类似ManualResetEvent之类的内容,等到事件进入信号状态后才能完成Stop。考虑到您尝试在同一过程中发出信号,ManualResetEventSlim可能更合适。

基本上,您可以在停止期间和处理来电Wait时为活动致电Reset,当您完成后,请致电Set

e.g。

private ManualResetEventSlim resetEvent = new ManualResetEventSlim(false);

public void InvProcessingChanges()
{
    resetEventSlim.Reset();
    try
    {
        // TODO: *the* processing
    }
    finally
    {
        resetEvent.Set();
    }
}

public void WaitUntilProcessingComplete()
{
    resetEvent.Wait();
}

并根据您的服务:

    protected override void OnStop()
    {
        WaitUntilProcessingComplete();
    }