0

15 秒ごとに実行する必要があるサービスがあります。間隔は構成ファイルで設定されます。サービスを開始/再起動すると、ワーカー スレッドが 1 回だけ実行され、意図したアクションが実行されます。

設定ファイル:

<?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

OK、私はワークフローを使用したことはありませんが、多くの Windows サービスを作成しました。通常、私がこのようなものを構築する方法は次のとおりです。

  1. タイマーをメイン スレッド (OnStart、OnStop などのスレッド) に対してグローバルにします。

  2. ワーカー スレッドで実行される処理コードをファイア アンド フォーゲットとして記述します。

  3. OnStart で、タイマーの interval プロパティを設定し、OnElapsed イベント ハンドラーを接続し、OnStart で最後にタイマーを開始します。

  4. OnElapsed イベント ハンドラーで (これは重要です)、最初にタイマーを停止します。ワーカー スレッドを起動して、処理を実行します。このイベント ハンドラーの最後に、タイマーを再起動します。

私が最初に行うことは、このプロセスが本当にマルチスレッドを必要とする (メリットがある) かどうかを評価することです。そうでない場合は、避けるべき複雑なレイヤーです。そうであれば、そうする必要があります-注意してください.

于 2012-08-13T15:47:01.523 に答える
0

ご回答ありがとうございます。この場合、それは私の側の問題でした。ミリ秒単位で間隔を指定していましたが、秒単位で指定する必要がありました。

于 2012-08-15T08:30:33.830 に答える