自定义锁,类似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); } } }