2012-08-13 43 views
0

我有一項服務需要每15秒運行一次。間隔在配置文件中設置。當我開始/重新啓動服務時,工作線程只執行一次並執行其預期的操作。服務每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

工作人員執行一次後服務是否停止?你確定工人在第一次通過後會重新執行嗎?如果可以,請張貼該代碼。 – CoreTech 2012-08-13 13:20:32

回答

0

感謝您的回覆。在這種情況下,這是我的問題。我以毫秒爲單位指定了間隔,因爲它應該在幾秒鐘內。

0

好的,我從來沒有使用過WorkFlows,但我寫了很多Windows服務。通常情況下,我構建這樣的東西的方式是:

  1. 使計時器成爲全局主線程(OnStart,OnStop等)。

  2. 編寫將在工作線程中運行的處理代碼,並將其視爲火和遺忘。

  3. 在OnStart中,設置計時器的時間間隔屬性,連接OnElapsed事件處理程序和OnStart中的最後一件事 - 啓動計時器。

  4. 在OnElapsed事件處理程序中 - 這很重要 - 首先停止計時器。開除工作者線程來完成它的工作。在這個事件處理程序中的最後一件事,重啓計時器

我會做的第一件事就是評估這個過程是否真的需要多線程的好處。如果不是這樣,它應該避免一層複雜性,如果是這樣,那就這麼做 - 只要小心。