/// <summary>
 /// 不停的执行行为,间隔时间为<paramref name="intervalMilliseconds"/>
 /// </summary>
 /// <param name="intervalMilliseconds"></param>
 /// <param name="action"></param>
 /// <param name="catchException"></param>
 public IntervalAction(int intervalMilliseconds, Action <IntervalAction> action, Action <Exception> catchException)
 {
     _intervalMilliseconds = intervalMilliseconds;
     _action         = action;
     _catchException = catchException;
     _delapyer       = new MediaDelayer();
     StartTask();
 }
        protected EatPattern(BreakDownHandler howBreakdown, BreakDownsHandler howBreakdowns, EatPatternConfig config)
        {
            _howBreakDown  = howBreakdown;
            _howBreakDowns = howBreakdowns;
            _config        = config;
            _rubbish       = new Rubbish();

            _stomach = new OneByOnePipeline(Digest);
            _enzyme  = new AutoResetPipeline(Breakdown);
            _lock    = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
            _outputElapsedStopwatch = new Stopwatch();

            _foods     = new Compounds <F>(config.MaxFoodStock, config.ReplaceMode, _rubbish);     //食物
            _nutrients = new Compounds <N>(config.MaxNutrientStock, config.ReplaceMode, _rubbish); //养分
            _delapyer  = new MediaDelayer();
        }
Beispiel #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="single">是否为单个食物输出单个养分</param>
        /// <param name="foodCount">喂的食物个数</param>
        /// <param name="maxFoodStock">最大食物储备量</param>
        /// <param name="maxNutrientStock">最大养分储备量</param>
        /// <param name="breakDownTime">粉碎食物的时间</param>
        /// <param name="nutrientOutputRunTime">养分输出的执行时间</param>
        public SatietyTestHelper(bool single, int foodCount, int eatFoodInterval, int maxFoodStock,
                                 int maxNutrientStock,
                                 TimeRange breakDownTime,
                                 TimeRange nutrientOutputRunTime)
        {
            _single                = single;
            _foodCount             = foodCount;
            _eatFoodInterval       = eatFoodInterval;
            _maxFoodStock          = maxFoodStock;
            _maxNutrientStock      = maxNutrientStock;
            _breakDownTime         = breakDownTime;
            _nutrientOutputRunTime = nutrientOutputRunTime;

            //实际输出时间应该在指定时间上下浮动20%
            var nutrientOutputInterval = single ? eatFoodInterval : eatFoodInterval / _nutrientsGroupCount;

            _maxNutrientOutputInterval = (double)nutrientOutputInterval * 1.2;
            _minNutrientOutputInterval = (double)nutrientOutputInterval * 0.8;
            _delapyer = new MediaDelayer();
        }
        public void HighResolutionSleep()
        {
            const int times     = 100; //运行次数
            const int sleepTime = 10;  //毫秒

            Stopwatch watch = new Stopwatch();

            MediaDelayer delayer = new MediaDelayer();
            long         elapsed = 0;

            for (var i = 0; i < times; i++)
            {
                watch.Restart();
                delayer.Sleep(sleepTime);
                elapsed += watch.ElapsedMilliseconds;
            }


            NumericalRangeInt nri = new NumericalRangeInt(sleepTime, 0.2f);
            var avg = (int)(elapsed / times);

            Assert.IsTrue(nri.Contains(avg));
        }