封装一个锁处理类_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 封装一个锁处理类

封装一个锁处理类

 2017/9/30 16:43:00  tqyitweb  程序员俱乐部  我要评论(0)
  • 摘要:在开发中为了防止多个线程同时访问同一资源的时候,我们一般会进行加锁处理,但看到有些同事写的那些散落的加锁代码感觉有些不太美观,于是自己给封装下:无标题html,body{font-size:15px}body{font-family:Helvetica,"HiraginoSansGB","微软雅黑","MicrosoftYaHeiUI",SimSun,SimHei,arial,sans-serif;line-height:1.6;margin:0;padding:1.33rem1rem}h1
  • 标签:一个

在开发中为了防止多个线程同时访问同一资源的时候 ,我们一般会进行加锁处理,但看到有些同事写的那些散落的加锁代码感觉有些不太美观,于是自己给封装下:

无标题


internal struct TimedLock : IDisposable {         /// <summary>         /// 默认超时秒数         /// </summary>         private const int timeoutSeconds = 5;         /// <summary>         /// 锁住对象         /// </summary>         private object target;         /// <summary>         /// 超时抛出异常         /// </summary>         private static bool throwTimeoutException;         /// <summary>         /// 构造函数         /// </summary>         /// <param name="o"></param>         private TimedLock(object o)         {             target = o;         }         /// <summary>         /// 锁住对象         /// </summary>         /// <param name="o">想要锁住的对象</param>         /// <param name="timeout">超时设置,默认为int.MaxValue</param>         /// <param name="throwException">超时抛出异常</param>         /// <returns></returns>         public static TimedLock Lock(object o, TimeSpan? timeout = nullbool throwException = false)         {             if (timeout == null)             {                 timeout = TimeSpan.FromSeconds(timeoutSeconds);             }             throwTimeoutException = throwException;             return GetLock(o, timeout.Value);         }         /// <summary>         /// 获取锁         /// </summary>         /// <param name="o">想要锁住的对象</param>         /// <param name="timeout">超时设置</param>         /// <returns></returns>         private static TimedLock GetLock(object o, TimeSpan timeout)         {             TimedLock tl = new TimedLock(o);             if (!Monitor.TryEnter(o, timeout) && throwTimeoutException)             {                    throw new TimeoutException("Timeout waiting for lock");             }             Console.WriteLine("Entered Thread " + Thread.CurrentThread.GetHashCode() + ":" + DateTime.Now);             return tl;         }         /// <summary>         /// 销毁,并释放锁         /// </summary>         public void Dispose()         {             if (target != nullMonitor.Exit(target);         }          }   调用示例: class Program
    {
        private static object o = new object();
        static void Main(string[] args)
        {
            //Retry();
            var t1 = new Thread(new ThreadStart(LockedSample1));
            t1.Name = "t1";
            t1.Start();
            var t2 = new Thread(new ThreadStart(LockedSample1));
            t2.Name = "t2";
            t2.Start();

            Console.ReadKey();
        }

        static void LockedSample1()
        {
            using (TimedLock lo = TimedLock.Lock(o, TimeSpan.FromSeconds(5), true))
            {
                LockedSample2();
            }
        }

        static void LockedSample2()
        {
            System.Threading.Thread.Sleep(10000);
        }
}
        
发表评论
用户名: 匿名