zoukankan      html  css  js  c++  java
  • ReaderWriterLockSlimHelper

    
    namespace Microshaoft.Web.ShareCache
    {
        using System;
        using System.Linq;
        using System.Collections.Generic;
        using System.Threading;
        using System.Threading.Tasks;
        using System.Diagnostics;
        using Microshaoft;
        public static class DataManager
        {
            //[STAThread]
            static void Main(string[] args)
            {
                Console.ReadLine();
                string r = string.Empty;
                while ((r = Console.ReadLine()) != "q")
                {
                    if (r == "w")
                    {
                        Tuple<string, DateTime, bool>[] a =
                                    new Tuple<string, DateTime, bool>[]
                                            {
                                                new Tuple<string, DateTime, bool>("aspx cs AAA", DateTime.Now, true)
                                                , new Tuple<string, DateTime, bool>("aspx cs BBB", DateTime.Now, false)
                                                , new Tuple<string, DateTime, bool>("aspx cs CCC", DateTime.Now, true)
                                            };
                        var list = a.ToList();
                        DataManager.ShareData = list;
                        ShareData
                            .ForEach
                                (
                                    (x) =>
                                    {
                                        Console.WriteLine(x.Item2);
                                    }
                                );
                    }
                    else
                    {
                        ParallelProcess();
                    }
                }
                Console.WriteLine(DataManager.F2);
                Console.WriteLine(Environment.Version.ToString());
            }
            private static void ParallelProcess()
            {
                var stopWatch = Stopwatch.StartNew();
                Parallel.For
                    (
                        0
                        , 10000 * 50
                        , new ParallelOptions()
                        {
                            MaxDegreeOfParallelism = 32
                        }
                        , (x) =>
                        {
                            var z =
                                DataManager.ShareData;
                                z.ForEach
                                    (
                                        (xx) =>
                                        {
                                            //Console.WriteLine(x.Item2);
                                        }
                                    );
                        }
                    );
                stopWatch.Stop();
                Console.WriteLine(stopWatch.ElapsedMilliseconds);
            }
            static DataManager()
            {
                Tuple<string, DateTime, bool>[] a = new Tuple<string, DateTime, bool>[]
                                                    {
                                                        new Tuple<string, DateTime, bool>("A", DateTime.Now, true)
                                                        , new Tuple<string, DateTime, bool>("B", DateTime.Now, false)
                                                        , new Tuple<string, DateTime, bool>("C", DateTime.Now, true)
                                                    };
                ShareData = a.ToList();
            }
            private static List<Tuple<string, DateTime, bool>> _shareData;
            private static ReaderWriterLockSlim _readerWriterLockSlim = new ReaderWriterLockSlim();
            public static List<Tuple<string, DateTime, bool>> ShareData
            {
                set
                {
                    _readerWriterLockSlim
                        .TryEnterWriterLockSlimWrite<List<Tuple<string, DateTime, bool>>>(ref _shareData, value, 2);
                }
                get
                {
                    return
                        _readerWriterLockSlim
                            .TryEnterReadLockSlimRead<List<Tuple<string, DateTime, bool>>>
                                (
                                    (x) =>
                                        {
                                            return _shareData;
                                        }
                                    , 10
                                );
                        //_shareData;
                }
            }
            public volatile static int F1 = 99, F2 = 100;
        }
    }
    namespace Microshaoft
    {
        using System;
        using System.Threading;
        public static class ReaderWriterLockSlimExtensionsMethodsManager
        {
            public static bool TryEnterWriterLockSlimWrite<T>
                                    (
                                        this ReaderWriterLockSlim writerLockSlim
                                        , ref T target
                                        , T newTarget
                                        , int enterTimeOutInSeconds
                                    )
                                        where T : class
            {
                return
                    ReaderWriterLockSlimHelper
                        .TryEnterWriterLockSlimWrite<T>
                            (
                                writerLockSlim
                                , ref target
                                , newTarget
                                , enterTimeOutInSeconds
                            );
            }
            public static T TryEnterReadLockSlimRead<T>
                            (
                                this ReaderWriterLockSlim readerLockSlim
                                , Func<ReaderWriterLockSlim, T> onReadedProcessFunc
                                , int enterTimeOutInSeconds
                            )
            {
                return
                    ReaderWriterLockSlimHelper
                        .TryEnterReadLockSlimRead<T>
                            (
                                readerLockSlim
                                , onReadedProcessFunc
                                , enterTimeOutInSeconds
                            );
            }
            public static bool TryEnterLockSlim
                                    (
                                        this ReaderWriterLockSlim lockSlim
                                        , Func<ReaderWriterLockSlim, bool> onEnterProcessFunc
                                        , Action action
                                        , Action<ReaderWriterLockSlim> onExitProcessAction
                                    )
            {
                return
                    ReaderWriterLockSlimHelper
                        .TryEnterLockSlim
                            (
                                lockSlim
                                , onEnterProcessFunc
                                , action
                                , onExitProcessAction
                            );
            }
        }
        public static class ReaderWriterLockSlimHelper
        {
            public static bool TryEnterWriterLockSlimWrite<T>
                                                    (
                                                        ReaderWriterLockSlim writerLockSlim
                                                        , ref T target
                                                        , T newTarget
                                                        , int enterTimeOutInSeconds
                                                    )
                                                        where T : class
            {
                bool r = false;
                //var rwls = new ReaderWriterLockSlim();
                int timeOut = Timeout.Infinite;
                if (enterTimeOutInSeconds >= 0)
                {
                    timeOut = enterTimeOutInSeconds * 1000;
                }
                try
                {
                    r = (writerLockSlim.TryEnterWriteLock(timeOut));
                    if (r)
                    {
                        Interlocked.Exchange<T>(ref target, newTarget);
                        r = true;
                    }
                }
                finally
                {
                    if (r)
                    {
                        writerLockSlim.ExitWriteLock();
                    }
                }
                return r;
            }
            public static T TryEnterReadLockSlimRead<T>
                                    (
                                        ReaderWriterLockSlim readerLockSlim
                                        , Func<ReaderWriterLockSlim, T> onReadedProcessFunc
                                        , int enterTimeOutInSeconds
                                    )
            {
                T r = default(T);
                var rr = false;
                //var rwls = new ReaderWriterLockSlim();
                int timeOut = Timeout.Infinite;
                if (enterTimeOutInSeconds >= 0)
                {
                    timeOut = enterTimeOutInSeconds * 1000;
                }
                try
                {
                    rr = (readerLockSlim.TryEnterReadLock(timeOut));
                    if (rr)
                    {
                        r = onReadedProcessFunc(readerLockSlim);
                        rr = true;
                    }
                }
                finally
                {
                    if (rr)
                    {
                        readerLockSlim.ExitReadLock();
                    }
                }
                return r;
            }
            public static bool TryEnterLockSlim
                                    (
                                        ReaderWriterLockSlim lockSlim
                                        , Func<ReaderWriterLockSlim, bool> onEnterProcessFunc
                                        , Action action
                                        , Action<ReaderWriterLockSlim> onExitProcessAction
                                    )
            {
                bool r = false;
                if (action != null)
                {
                    try
                    {
                        r = onEnterProcessFunc(lockSlim);
                        if (r)
                        {
                            action();
                            r = true;
                        }
                    }
                    finally
                    {
                        if (r)
                        {
                            onExitProcessAction(lockSlim);
                        }
                    }
                }
                return r;
            }
        }
    }
    
    
  • 相关阅读:
    绝对干货:供个人开发者赚钱免费使用的一些好的API接口
    科普技术贴:个人开发者的那些赚钱方式
    北漂程序员的笑与泪
    非著名程序员公众号
    北漂程序员的笑与泪
    【有人@我】Android中高亮变色显示文本中的关键字
    新时代的coder如何成为专业程序员
    自定义圆形控件RoundImageView并认识一下attr.xml
    偷天换日:网络劫持,网页js被伪装替换。
    jeesite 去掉 /a
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/2484412.html
Copyright © 2011-2022 走看看