0

我有一项服务需要每 15 秒运行一次。间隔在配置文件中设置。当我启动/重新启动服务时,工作线程只执行一次并执行其预期的操作。

配置文件:

<?xml version="1.0"?>
<configuration>

  <configSections>

  <appSettings>
    <!-- Worker thread will start after 15 seconds interval -->
    <add key="Interval" value="15000"/>

  </appSettings>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>

</configuration>

服务代码:

using System;
using System.ServiceProcess;

using WorkflowSupport;
using BitFactory.Logging;
using Efts.Framework.Resources;
using Efts.Framework.Core;


namespace Efts.Framework.Service
{
    public partial class QueueService : ServiceBase
    {
        private WorkflowManager _worker;

        public QueueService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            try
            {
                // get the polling interval or initialize if missing
                var pollTime = int.Parse(ConfigHelper.Interval());

                // create the thread worker
                _worker = new WorkflowManager("Queue Service",
                                                     new Worker(), //in Efts.Framework.Core
                                                     pollTime,
                                                     true);
                // wire up the event listeners
                WireupWorkflowManagerEvents(_worker);

                // go
                _worker.Start();

            }
            catch (Exception ex)
            {
                ConfigLogger.Instance.LogError(String.Format("{0}{1}::{2}", ex.Message,
                                                             String.IsNullOrWhiteSpace(ex.InnerException.Message)
                                                                 ? String.Empty
                                                                 : String.Format("::{0}", ex.InnerException.Message)
                                                             , ex.StackTrace));
            }
        }

        protected override void OnStop()
        {
            _worker.Stop();
        }

        /// <summary>
        /// Wireups the workflow manager events.
        /// </summary>
        /// <param name="workflowManager">The request workflow manager.</param>
        private static void WireupWorkflowManagerEvents(WorkflowManager workflowManager)
        {
            workflowManager.Started +=
                ((sender, e) => ConfigLogger.Instance.LogDebug(String.Format("{0}: Workflow started", workflowManager.Name)));

            workflowManager.Stopped +=
                ((sender, e) => ConfigLogger.Instance.LogDebug(String.Format("{0}: Workflow stopped", workflowManager.Name)));

            workflowManager.BeginWork +=
                ((sender, e) => ConfigLogger.Instance.LogDebug(String.Format("{0}: Workflow worker is beginning work", workflowManager.Name)));

            workflowManager.EndWork +=
                ((sender, e) => ConfigLogger.Instance.LogDebug(String.Format("{0}: Workflow worker is done.", workflowManager.Name)));

            workflowManager.Message += ((sender, e) => ConfigLogger.Instance.LogInfo(String.Format("{0}: {1}", workflowManager.Name, e.Message)));
        }

    }
}

我在这里有点不知所措。我在这里想念什么?

4

2 回答 2

0

好的,我从未使用过 WorkFlows,但我已经编写了很多 Windows 服务。通常我构建这样的方式是:

  1. 使计时器对主线程(具有 OnStart、OnStop 等的线程)全局化。

  2. 编写将在工作线程中运行的处理代码,即“一劳永逸”。

  3. 在 OnStart 中,设置计时器的时间间隔属性,连接 OnElapsed 事件处理程序和 OnStart 中的最后一件事 - 启动计时器。

  4. 在 OnElapsed 事件处理程序中 - 这很重要 - 首先要停止计时器。关闭工作线程来做它的事情。此事件处理程序中的最后一件事,重新启动计时器。

我要做的第一件事是评估这个过程是否真的需要(受益)多线程。如果不是,那是您应该避免的一层复杂性,如果是这样,那就这样吧 - 请小心。

于 2012-08-13T15:47:01.523 回答
0

感谢您的回复。在这种情况下,这是我的问题。我以毫秒为单位指定间隔,而它应该以秒为单位。

于 2012-08-15T08:30:33.830 回答