1

私はWindowsサービスの作成とスレッド化を学んでいます。スレッドサービスの構築を支援する同僚から提供されたライブラリを使用していますが、これは基本的なレベルの知識を私に与えていません。

長時間実行され(ネットで利用可能な基本的な例よりも少し進んでいます)、15秒ごとにウェイクアップしてから、そのアクションを実行する必要があるサービスがあるとします(基本的には常に実行されます)。アクションには、DBでステータスを検索してから、アクションを実行することが含まれます。

このような場合、次の処理をどのように行う必要がありますか
。1.スレッドを破棄します
。2。アクションの実行に間隔よりも時間がかかる場合。

次の例を見つけましたが、上記の2つの点で問題があります。サービスは常に実行されていることに注意してください。

http://www.java2s.com/Tutorial/CSharp/0280__Development/CreatethedelegatethattheTimerwillcall.htm

using System;
using System.Threading;

class MainClass
{
  public static void CheckTime(Object state) 
  {
    Console.WriteLine(DateTime.Now);
  }

  public static void Main() 
  {
    TimerCallback tc = new TimerCallback(CheckTime);


    Timer t = new Timer(tc, null, 1000, 500);

    Console.WriteLine("Press Enter to exit"); 
    int i = Console.Read();

    // clean up the resources
    t.Dispose();
    t = null;
  }
}

したがって、私の例では、 1。イベントの
停止
2.イベントの開始は良さそうですか?
3.キューに何も見つからない場合はどうなりますか?
4.アクションに間隔よりも時間がかかる場合はどうなりますか?

public partial class QueueService : ServiceBase
    {


        public QueueService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            try
            {
                TimerCallback tc = new TimerCallback(CheckQueue);


            Timer t = new Timer(tc, null, 10000, 15000); //first time wait for 10seconds and then execte every 15seconds

            }
            catch (Exception ex)
            {
        what should i be checking here and then also make sure that the threading/timer doesn't stop. It should still execute every 15 seconds
            }
        }

        protected override void OnStop()
        {

        what needs to go here...

        }

        private static void CheckQueue(Object state) 
    {
            ... Connect to the DB
        ... Check status
        ... if queue status found then perform actions
        . A
        . C
        . T
        . I
        . O
        . N
        . S
        ... if end

    }

    }

見てくれてありがとう!

4

1 に答える 1

1
  1. タイマーを破棄します。
  2. 完全ではありません。クラスレベルでタイマーを宣言する必要があります。そうしないと、数回の反復後にタイマーが収集されます。
  3. 何もない。
  4. キューを確認する前にタイマーを停止し、終了後にタイマーを再開します。これにより、共有メモリやその他の衝突の問題が発生することはありません。

    パブリック部分クラスQueueService:ServiceBase {

    タイマータイマー;

     public QueueService()
     {
         InitializeComponent();
     }
    
     protected override void OnStart(string[] args)
     {
        try
        {
           TimerCallback tc = new TimerCallback(CheckQueue);
    
           timer = new Timer(tc, null, 10000, 15000);
        }
        catch (Exception ex)
        {
    
        }
    }
    
    protected override void OnStop()
    {
        if (timer != null)
            timer.Dispose();
    }
    
    private static void CheckQueue(Object state) 
    {
        timer.Change(Timeout.Infinite, 0);
    
        ... Connect to the DB
        ... Check status
        ... if queue status found then perform actions
        . A
        . C
        . T
        . I
        . O
        . N
        . S
        ... if end
    
        timer.Change(10000, 15000);
    
    }
    

    }

于 2012-08-13T07:15:46.567 に答える