您的位置:首页 > 其它

同步ReaderWriterLockSlim

2015-06-02 07:10 537 查看
使用方法:

1.在方法之外添加 ReaderWriterLockSlim类.

2.使用try语句。注意write与read不同。

写   

         try

            {

                while (!rwl.TryEnterWriteLock(50))//没有获取到写锁

                {

                   //do other something

                }

                rwl.EnterReadLock();

              //do something

            }

            finally 

            {

                rwl.ExitWriteLock();

            }



try

            {

                rwl.EnterReadLock();

                //批量读取公共变量

                do something;

            }

            finally

            {

                rwl.ExitReadLock();

            }

样例代码:

class Program

    {

        private static ReaderWriterLockSlim rwl = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);//声明静态类,支持递归方式.

        private static List<int> testData = new List<int>(){0,1,2,3,4,5};

        static void Main(string[] args)

        {

            var Tasks = new Task[3];

            var taskfactory = new TaskFactory(TaskCreationOptions.LongRunning,TaskContinuationOptions.None);

            Tasks[0] = taskfactory.StartNew(ReadMethod ,1);

            Tasks[1] = taskfactory.StartNew(WriteMethod, 2);

            Tasks[2] = taskfactory.StartNew(ReadMethod, 3);

            Console.ReadKey();

        }

        static void WriteMethod(object identification)

        {

            try

            {

                while (!rwl.TryEnterWriteLock(50))//没有获取到写锁

                {

                    Console.WriteLine("don't get writeLock");

                    Console.WriteLine("Current reader count:{0}",rwl.CurrentReadCount);

                }

                rwl.EnterReadLock();

                //写公共变量

                for (int i = 0; i < testData.Count; i++)

                {

                    testData[i]+=6;

                }

                Console.WriteLine("{0} writer is finished", identification);

                ReadMethod(55);

            }

            finally 

            {

                rwl.ExitWriteLock();

            }

        }

        static void ReadMethod(object identification)

        {

            try

            {

                rwl.EnterReadLock();

                //批量读取公共变量

                for (int i = 0; i < testData.Count; i++)

                {

                    Console.WriteLine("{0} reading {1},Current value is  {2}", identification, i, testData[i]);

                    Thread.Sleep(10);

                }

            }

            finally

            {

                rwl.ExitReadLock();

            }

        }

  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: