ConcurrentDictionary缓存

    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 100; i++)
            {
                Thread t = new Thread(Test);
                t.Start();
            }
            Console.Read();
        }

        static void Test()
        {
            var memoize = Memoize<string, string>.MemoizeThreadSafe(GetString);
            Console.WriteLine(memoize("A"));
            Thread.Sleep(TimeSpan.FromSeconds(1));
            Console.WriteLine(memoize("B"));
            Thread.Sleep(TimeSpan.FromSeconds(1));
            Console.WriteLine(memoize("A"));
        }

        public static string GetString(string name)
        {
            return $"return data {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} string {name}";
        }
    }

    public static class Memoize<T, R> where T : IComparable
    {
        private static ConcurrentDictionary<T, R> cache = new ConcurrentDictionary<T, R>();

        public static Func<T, R> MemoizeThreadSafe(Func<T, R> func)
        {
            return arg =>
            {
                return cache.GetOrAdd(arg, a => func(arg));
            };
        }
    }

1、GetOrAdd不是原子操作,可以用Lazy延迟加载

    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 100; i++)
            {
                Thread t = new Thread(Test);
                t.Start();
            }
            Console.Read();
        }

        static void Test()
        {
            var memoize = Memoize<string, string>.MemoizeThreadSafe(GetString);
            Console.WriteLine(memoize("A").Value);
            Thread.Sleep(TimeSpan.FromSeconds(1));
            Console.WriteLine(memoize("B").Value);
            Thread.Sleep(TimeSpan.FromSeconds(1));
            Console.WriteLine(memoize("A").Value);
        }

        public static Lazy<string> GetString(string name)
        {
            return new Lazy<string>(() => $"return data {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} string {name}");
        }
    }

    public static class Memoize<T, R> where T : IComparable
    {
        private static ConcurrentDictionary<T, Lazy<R>> cache = new ConcurrentDictionary<T, Lazy<R>>();

        public static Func<T, Lazy<R>> MemoizeThreadSafe(Func<T, Lazy<R>> func)
        {
            return arg =>
            {
                return cache.GetOrAdd(arg, a => func(arg));
            };
        }
    }

 

posted @ 2022-02-23 17:03  江境纣州  阅读(69)  评论(0编辑  收藏  举报