예제 #1
0
        internal event EventHandler <TickEventArgs> Tick;                                //event som driver hela simuleringen

        internal void StartTick(int ticksPerSecond, int days)                            //tar emot hastighet och hur länge simuleringen ska ske
        {
            var startDate     = DateTime.Parse("1993 - 08 - 01 07:00:00");               //sätter startdatum
            var endDate       = startDate.AddDays(days);                                 //sätter slutdatumet med hjälp av startdatum och antal dagar som ska läggas till
            var tickEventArgs = new TickEventArgs(startDate, endDate);                   //gör en ny instans av tickeventargs men startdatum och slutdatum

            while (!tickEventArgs.IsPaused & tickEventArgs.Date < tickEventArgs.EndDate) //medans pausboolen är falsk och startdatumet är mindre än slutdatumet körs loopen
            {
                Tick?.Invoke(this, tickEventArgs);                                       //invokar eventet med instansen av tickeventargs
                System.Threading.Thread.Sleep(ticksPerSecond);                           //pausar tråden i den bestämda hamstigheten
                tickEventArgs.Date = tickEventArgs.Date.AddMinutes(6);                   //lägger till 6 minuter på simulationsdatumet för varje tick
            }
        }
        private async void StartThreads(object sender, TickEventArgs e)                                               //async metod som anropas på varje tick
        {
            if (e.Date.TimeOfDay == TimeSpan.Parse("17:00:00"))                                                       //kollar om kl är 17, då är dagen över
            {
                e.IsPaused = true;                                                                                    //simuleringen pausas
                Date       = e.Date;                                                                                  //date sätts till datumet simuleringen är på

                var   checkOutTask = CheckOutHamstersForTheDay();                                                     //skapar en task som skickar hem hamstrarna för dagen
                await checkOutTask;                                                                                   //awaitar tasken

                PrintEvent?.Invoke(this, new PrintEventArgs(Print(), e.Date));                                        //invokar ett event som skriver ut vad som hänt detta tick
                ReportEvent?.Invoke(this, new ReportEventArgs(HDCon.Hamsters.ToList(), HDCon.ActivityLogs.ToList())); //invokar ett event som genererar och skriver ut rapport för dagen

                var logs = HDCon.ActivityLogs;
                HDCon.ActivityLogs.RemoveRange(logs);                                   //tömmer logs i databasen
                HDCon.SaveChanges();                                                    //sparar ändringar

                e.Date     = e.Date.AddHours(13.9);                                     //lägger till 13.9h på simuleringen för att starta en ny dag
                e.IsPaused = false;                                                     //startar simuleringen igen
            }
            else if (e.Date.Hour >= 7 & e.Date.TimeOfDay <= TimeSpan.Parse("17:00:00")) //om kl är mellan 07.00 och 17.00
            {
                Date = e.Date;                                                          //date sätts till datumet simuleringen är på

                if (e.Date.TimeOfDay == TimeSpan.Parse("07:00:00"))                     //om kl är 07.00
                {
                    var   addToCageTask = AddHamstersToCages();                         //skapar en task för att checka in hamstrarna för dagen, behöver endast göras en gång per dag
                    await addToCageTask;                                                //awaitar tasken
                }


                var retrieveFromExerciseTask = RetreiveHamstersFromExtersiceArea(); //skapar en task som plockar ut hamstrar från träningsområdet
                var addToExerciseTask        = AddHamstersToExerciseArea();         //skapar en task som lägger till hamstrar till träningsområdet

                await retrieveFromExerciseTask;                                     //awaitar tasken
                await addToExerciseTask;                                            //awaitar tasken
                PrintEvent?.Invoke(this, new PrintEventArgs(Print(), e.Date));      //invokar ett event som skriver ut vad som hänt detta tick
            }
        }