Windows服务和计时器

时间:2012-08-13 07:02:54

标签: multithreading timer windows-services

我正在学习创建Windows服务和线程。我正在使用同事提供的库,它有助于构建线程服务,但这并没有给我基本级别的知识。

假设我将拥有一个长期运行的服务(比网上可用的基本示例稍微提前一点),需要每15秒唤醒一次然后执行其动作(基本上将始终运行)。操作涉及在数据库中查找状态,然后执行操作。

在这种情况下应如何处理以下事项:
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

    }

    }

感谢您的期待!

1 个答案:

答案 0 :(得分: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);
    
    }
    

    }