示例#1
0
        private DailyCounter PrepareCounter(VisitorsCounter counter, int prev = 0)
        {
            var model = new DailyCounter
            {
                date   = counter.LastDate,
                Count  = counter.TodayCount,
                ToPrev = counter.TodayCount - prev
            };

            return(model);
        }
示例#2
0
        public async Task TestRunInParallel_ParallelismDegree(int totalTasks, int maxDegreeOfParallelism)
        {
            VisitorsCounter visitorsCounter = new VisitorsCounter(maxDegreeOfParallelism);
            await TaskUtils.RunInParallel(((Func <Task>)(async() =>
            {
                visitorsCounter.Enter();
                await Task.Delay(RUNNING_TIME);
                visitorsCounter.Leave();
            })).Repeat(totalTasks), maxDegreeOfParallelism);

            Assert.Zero(visitorsCounter.CurrentVisitors);
            Assert.AreEqual(totalTasks, visitorsCounter.TotalVisitors);
            Assert.AreEqual(Math.Min(maxDegreeOfParallelism, totalTasks), visitorsCounter.MaxConcurrentVisitors);
        }
示例#3
0
        public void TestRunInParallel_ErrorHandling(ICollection <bool> whenToThrowException, int maxDegreeOfParallelism)
        {
            VisitorsCounter            visitorsCounter = new VisitorsCounter(maxDegreeOfParallelism);
            IEnumerable <Func <Task> > opeartions      = whenToThrowException.Select((toThrow) => (Func <Task>)(async() =>
            {
                visitorsCounter.Enter();
                await Task.Delay(RUNNING_TIME);
                visitorsCounter.Leave();
                if (toThrow)
                {
                    throw new ArgumentException();
                }
            }));
            int errorsNumber = whenToThrowException.Count((b) => b);

            Assert.AreEqual(errorsNumber,
                            Assert.ThrowsAsync <AggregateException>(() => TaskUtils.RunInParallel(opeartions, maxDegreeOfParallelism)).InnerExceptions.Count);
            Assert.Zero(visitorsCounter.CurrentVisitors);
            Assert.AreEqual(whenToThrowException.Count, visitorsCounter.TotalVisitors);
            Assert.AreEqual(Math.Min(maxDegreeOfParallelism, whenToThrowException.Count), visitorsCounter.MaxConcurrentVisitors);
        }
示例#4
0
        /// <summary>
        /// обновление статистики в бд
        /// </summary>
        public void SaveCounters()
        {
            var data = _context.GetAll.FirstOrDefault(c => c.LastDate == DateTime.Today);

            if (data != null)
            {
                data.TotalCount = _totalCounter;
                data.TodayCount = _todayCounter;

                _context.Update(data);
                return;
            }
            var storedData = new VisitorsCounter
            {
                LastDate   = _currentDate,
                TodayCount = _todayCounter,
                TotalCount = _totalCounter
            };

            _context.Add(storedData);
        }