我有一项需要每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)));
}
}
}
我在这里有点不知所措。我在这里缺少什么?
答案 0 :(得分:0)
好的,我从未使用过WorkFlows,但我写了很多Windows服务。通常我构建这样的结构的方式是:
使计时器全局到主线程(OnStart,OnStop等)。
将在工作线程中运行的处理代码写成火灾并忘记。
在OnStart中,设置timer的interval属性,连接OnElapsed事件处理程序和OnStart中的最后一项 - 启动计时器。
在OnElapsed事件处理程序中 - 这很重要 - 首先停止计时器。解雇工作线程来做它的事情。在此事件处理程序的最后一件事,重新启动计时器。
我要做的第一件事是评估这个过程是否确实需要多线程的(好处)。如果不是,你应该避免一层复杂性,如果是这样那么就是这样 - 只要小心。
答案 1 :(得分:0)
感谢您的回复。在这种情况下,这是我的问题。我指的是以毫秒为单位的间隔,它应该是以秒为单位。