c# 自定义锁

自定义锁,类似Monitor,可跨线程处理

 public static class MonitorEx
    {

        private static Dictionary<object, AutoResetEvent> m_lstLocks = new Dictionary<object, AutoResetEvent>();

        /// <summary>
        /// 功能描述:在指定对象上获取排他锁
        /// 作  者:beck.huang
        /// 创建日期:2018-06-05 11:16:15
        /// 任务编号:中餐
        /// </summary>
        /// <param name="obj">obj</param>
        public static void Enter(object obj)
        {
            lock (m_lstLocks)
            {
                if (!m_lstLocks.ContainsKey(obj))
                {
                    m_lstLocks[obj] = new AutoResetEvent(true);
                }
            }
            m_lstLocks[obj].WaitOne();
        }


        /// <summary>
        /// 功能描述:尝试获取指定对象的排他锁
        /// 作  者:beck.huang
        /// 创建日期:2018-06-05 11:34:28
        /// 任务编号:中餐
        /// </summary>
        /// <param name="obj">obj</param>
        /// <returns>返回值</returns>
        public static bool TryEnter(object obj)
        {
            lock (m_lstLocks)
            {
                if (!m_lstLocks.ContainsKey(obj))
                {
                    m_lstLocks[obj] = new AutoResetEvent(true);
                }
            }

            bool bln = m_lstLocks[obj].WaitOne(0);
            return bln;
        }

        /// <summary>
        /// 功能描述:锁是否可用
        /// 作  者:beck.huang
        /// 创建日期:2018-06-05 14:25:28
        /// 任务编号:中餐
        /// </summary>
        /// <param name="obj">obj</param>
        /// <returns>返回值</returns>
        public static bool GetStat(object obj)
        {
            if (m_lstLocks.ContainsKey(obj) && m_lstLocks[obj] != null)
            {
                bool bln = m_lstLocks[obj].WaitOne(0);
                if (bln)
                {
                    m_lstLocks[obj].Set();
                }
                return bln;
            }
            return true;
        }

        /// <summary>
        /// 功能描述:通知等待队列中的线程锁定第一个对象状态的更改。
        /// 作  者:beck.huang
        /// 创建日期:2018-06-05 11:32:47
        /// 任务编号:中餐
        /// </summary>
        /// <param name="obj">obj</param>
        public static void Pulse(object obj)
        {
            if (m_lstLocks.ContainsKey(obj) && m_lstLocks[obj] != null)
            {
                m_lstLocks[obj].Set();
            }
        }

        /// <summary>
        /// 功能描述: 释放对象上的锁并阻止当前线程,直到它重新获取该锁。
        /// 作  者:beck.huang
        /// 创建日期:2018-06-05 11:35:36
        /// 任务编号:中餐
        /// </summary>
        /// <param name="obj">obj</param>
        /// <returns>返回值</returns>
        public static void Wait(object obj)
        {
            if (m_lstLocks.ContainsKey(obj) && m_lstLocks[obj] != null)
            {
                m_lstLocks[obj].WaitOne();
            }
            else
            {
                m_lstLocks[obj] = new AutoResetEvent(false);
            }
        }
    }
View Code

猜你喜欢

转载自www.cnblogs.com/bfyx/p/9139824.html