1

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

如何安全地停止在 Windows 服务中运行的 C# .NET 线程?

在 ManualResetEvent 或 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 服务还很陌生。此服务需要在实际停止之前完成发送库存更新。

4

1 回答 1

3

您可以使用类似ManualResetEvent等到事件进入有信号状态后再完成的方法StopManualResetEventSlim考虑到您尝试在同一过程中发出信号,可能更合适。

基本上,您可以Wait在停止期间和处理呼叫Reset时调用事件,完成后调用Set

例如

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();
    }
于 2013-02-19T03:52:44.517 回答