天天看點

單例模式-多線程單例模式

using System;

 using System.Threading;



 namespace Rattan.ERP.TMS.Services.EOP

 {

   /// <summary>

   /// 單線程隊列,建立 EOP 訂單

   /// </summary>

   public class ThreadCreateEopOrder

   {

     #region 單例模式

     private ThreadCreateEopOrder()

     {

     }

     /// <summary>

     /// 線程安全鎖

     /// </summary>

     private static readonly object m_lock = new object();

     private volatile static ThreadCreateEopOrder m_instance = null;

     /// <summary>

     /// 執行個體化 ThreadCreateEopOrder 對象

     /// </summary>

     /// <returns></returns>

     public static ThreadCreateEopOrder CreateInstance()

     {

       if (m_instance == null)

       {

         lock (m_lock)

         {

           if (m_instance == null)

             m_instance = new ThreadCreateEopOrder();

         }

       }

       return m_instance;

     }

     #endregion



     #region 枚舉

     /// <summary>

     /// 枚舉

     /// </summary>

     public enum EnumState

     {

       /// <summary>

       /// 未開始

       /// </summary>

       None = 0,   

       /// <summary>

       /// 開始

       /// </summary>

       Start = 1,   

       /// <summary>

       /// 正在執行

       /// </summary>

       Doing = 2,   

       /// <summary>

       /// 執行完畢

       /// </summary>

       End = 3,    

     }



     private volatile static EnumState m_state = EnumState.None;

     /// <summary>

     /// 執行狀态

     /// </summary>    

     public static EnumState State

     {

       get { return m_state; }

       //set { m_State = value; }

     }

     #endregion



     /// <summary>

     /// 線程

     /// </summary>

     private Thread m_thread = null;



     /// <summary>

     /// 開啟一個程序

     /// </summary>

     public void RunWork()

     {

       //確定臨界區被一個Thread所占用 

       lock (m_lock)

       {

         if (State == EnumState.None || State == EnumState.End)

         {

           //初始化線程

           m_thread = new Thread(new ThreadStart(DoWork))

           {

             Name = "建立 EOP 訂單線程"

           };

           m_thread.Start();

           //WorkFromDate = DateTime.Now;

           m_state = EnumState.Start;

         }

       }

     }



     /// <summary>

     /// 處理消息隊列中的資料

     /// </summary>

     private void DoWork()

     {

       try

       {

         m_state = EnumState.Doing;

#region 需要執行的主要程式代碼

         CreateEopOrder eopOrder = new CreateEopOrder();

         eopOrder.Start();

#endregion

       }

       catch (Exception ex)

       {

         Grass.Log.ExceptionsStack.RegisterError(ex);

       }

       finally

       {

         m_state = EnumState.End;

       }

     }



   }

 }      

繼續閱讀