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 } }