Exemple #1
0
        /// <summary>
        /// 获取红包配置
        /// </summary>
        /// <returns></returns>
        static RedPacketConfig GetRedPacketConfig()
        {
            //总金额
            decimal amount = 300 * 300 + 100;
            //100 * 81 + 17  有3.32  小于最小值3.33
            //总红包数
            int packageCount = 250;
            //上限
            decimal ceiling = 20;
            //下限
            decimal floor = 30;
            //均分红包
            decimal avgPkg = Math.Round(amount / packageCount, 2);
            //最大红包
            decimal maxPkg = Math.Round(avgPkg * (100 + ceiling) / 100, 2);
            //最小红包
            decimal minPkg = Math.Round(avgPkg * (100 - floor) / 100, 2);

            RedPacketConfig config = new RedPacketConfig()
            {
                Amount              = amount,
                PacketCount         = packageCount,
                CurrentAmount       = currentAmount,
                CurrentPackageCount = currentPackageCount,
                Ceiling             = ceiling,
                Floor             = floor,
                StartTime         = DateTime.Now.AddMinutes(-10),
                EndTime           = DateTime.Now.AddMinutes(10),
                RedPacketIdentity = redPacketIdentity
            };

            return(config);
        }
Exemple #2
0
        /// <summary>
        /// 多线程下运行
        /// </summary>
        static void RunWithMultiThread()
        {
            Func <RedPacketConfig> func = new Func <RedPacketConfig>(GetRedPacketConfig);

            RedPacketConfig config = null;

            lock (configRWLock)
            {
                config = func.Invoke();
            }

            //尝试提前初始化红包池
            RedPacketProvider.TryInitPackagePool(func);

            for (int i = 0; i < config.PacketCount + 10; i++)
            {
                Thread thread = new Thread(() =>
                {
                    lock (configRWLock)
                    {
                        var money = RedPacketProvider.GetOneRedPacket(func);
                        System.Console.WriteLine(money + "");

                        //模拟红包池意外清空的情况
                        if (i == 100 || i == 60 || i == 210)
                        {
                            RedPacketProvider.Reset();
                        }


                        //模拟活动变更的情况
                        if (i == 190 || i == 105)
                        {
                            redPacketIdentity = Guid.NewGuid().ToString();
                        }

                        //模拟数据库  更新当前已发的红包总金额与总数
                        currentAmount += money;
                        currentPackageCount++;
                    }
                });

                thread.Start();
            }

            System.Console.WriteLine("正在统计总金额...");
            //暂停三秒 保证已经统计了所有金额
            Thread.Sleep(3000);
            System.Console.WriteLine("Sum:{0},Count:{1}", currentAmount, currentPackageCount);
            System.Console.ReadKey();
        }
Exemple #3
0
        private void GetOneRedPacketTest()
        {
            Func <RedPacketConfig> func   = new Func <RedPacketConfig>(GetRedPacketConfig);
            RedPacketConfig        config = null;

            lock (configRWLock)
            {
                config = func.Invoke();
            }
            int            errorCount = 0;
            List <decimal> errorList  = new List <decimal>();

            //均分红包
            decimal avgPkg = Math.Round(config.Amount / config.PacketCount, 2);
            //最大红包
            decimal maxPkg = Math.Round(avgPkg * (100 + config.Ceiling) / 100, 2);
            //最小红包
            decimal minPkg = Math.Round(avgPkg * (100 - config.Floor) / 100, 2);


            while (true)
            {
                lock (configRWLock)
                {
                    var money = RedPacketProvider.GetOneRedPacket(func);
                    if (money <= 0)
                    {
                        break;
                    }
                    if (money > maxPkg || money < minPkg)
                    {
                        errorList.Add(money);
                        errorCount++;
                    }
                    //模拟数据库  更新当前已发的红包总金额与总数
                    currentAmount += money;
                    currentPackageCount++;
                }
            }

            config.Amount.ShouldBe(currentAmount);
            errorCount.ShouldBe(0);
        }
Exemple #4
0
        /// <summary>
        /// 获取红包配置
        /// </summary>
        /// <returns></returns>
        static RedPacketConfig GetRedPacketConfig()
        {
            //总金额
            decimal amount = 300 * 300 + 100;
            //100 * 81 + 17  有3.32  小于最小值3.33
            //总红包数
            int packageCount = 250;
            //上限
            decimal ceiling = 20;
            //下限
            decimal floor = 30;

            //模拟活动进行时配置更改
            if (currentPackageCount >= 200)
            {
                amount       += 200;
                packageCount += 6;
                ceiling       = 5;
                //floor = 0;
            }

            RedPacketConfig config = new RedPacketConfig()
            {
                Amount              = amount,
                PacketCount         = packageCount,
                CurrentAmount       = currentAmount,
                CurrentPackageCount = currentPackageCount,
                Ceiling             = ceiling,
                Floor             = floor,
                StartTime         = DateTime.Now.AddMinutes(-10),
                EndTime           = DateTime.Now.AddMinutes(10),
                RedPacketIdentity = redPacketIdentity
            };

            return(config);
        }