结合singleton和线程做一个定时服务

发表于:2007-06-30来源:作者:点击数: 标签:
design pattern的singleton是一个虽然简单但很有用处的模式,它的作用就是使类只能有一个实例,不需要实例化,而提供一个唯一的全局切入点。如果再结合上线程,完全可以实现一个定时服务,不象Timer控件,它不仅可以应用在 windows 应用程序中,同样可以应用
     design pattern的singleton是一个虽然简单但很有用处的模式,它的作用就是使类只能有一个实例,不需要实例化,而提供一个唯一的全局切入点。如果再结合上线程,完全可以实现一个定时服务,不象Timer控件,它不仅可以应用在windows应用程序中,同样可以应用于web程序中,就象刚才蓝说的那种效果。看下面这个简单的例子吧。
  
  using System;
  using System.Threading ;
  
  namespace testall
  {
   ///
   /// 一个web job的示例类
   ///

   /// 符合design pattern的singleton模式
   public class TestStatic
   {
   ///
   /// 定时间隔
   ///

   /// 通过修改这个常量决定间隔多长时间做某件事
   const int DELAY_TIMES = 1000 ;
  
   ///
   /// 一个计数器
   ///

   private int m_intCounter = 0;
  
   ///
   /// 是否退出
   ///

   private bool m_bCanExit = false ;
  
   ///
   /// 线程
   ///

   private Thread thread ;
  
   ///
   /// 自身实例
   ///

   /// 注意,这是实现singleton的关键
   private static TestStatic instance = new TestStatic() ;
  
   public int Counter
   {
   get
   {
   return this.m_intCounter ;
   }
   set
   {
   this.m_intCounter = value ;
   }
   }
  
   public bool CanExit
   {
   set
   {
   this.m_bCanExit = value ;
   }
   }
  
   ///
   /// 构造函数
   ///

   public TestStatic()
   {
   //
   // TODO: Add constructor logic here
   //
   this.m_intCounter = 0 ;
   Console.WriteLine("constructor is running") ;
   this.thread = new Thread(new ThreadStart(ThreadProc)) ;
   thread.Name = "online user" ;
   thread.Start() ;
   Console.WriteLine("完毕") ;
   }
  
  
   ///
   /// 实现singleton的关键
   ///

   /// 类本身的一个实例
   /// 唯一的全局切入点
   public static TestStatic GetInstance()
   {
   return instance ;
   }
  
   ///
   /// 线程工作函数
   ///

   /// 想做什么写在这儿
   private void ThreadProc()
   {
   while(!this.m_bCanExit)
   {
   this.m_intCounter ++ ;
   Console.WriteLine(this.m_intCounter.ToString()) ;
   Thread.Sleep(DELAY_TIMES) ;
   }
   }
  
   static void Main(string[] args)
   {
   //
   // TODO: Add code to start application here
   //
   Console.WriteLine(TestStatic.GetInstance().Counter.ToString()) ;
   Console.Read() ;
   TestStatic.GetInstance().CanExit = true ;
   }
  
   }
  
  }
  
  

原文转自:http://www.ltesting.net