public static async Task StartRaceAsync(int id) { SQLiteDataAccess.InstanceDB(); var race = GetRace(id); race.RaceStatus = (int)Enums.RaceStatus.running; UpdateRace(race); //Update all vehicle status to 0 VehicleDataLayer.UpdateVehicleStatus(); List <VehicleModel> allVehicle = VehicleDataLayer.GetAllVehicles(); List <Task <VehicleModel> > tasks = new List <Task <VehicleModel> >(); foreach (var v in allVehicle) { tasks.Add(Task.Run(() => VehicleStartRace(v))); } var raceResult = await Task.WhenAll(tasks); race.RaceStatus = (int)Enums.RaceStatus.finished; UpdateRace(race); }
private static VehicleModel VehicleStartRace(VehicleModel vehicle) { int i = 1; int totalDistance = 10000; Random random = new Random(); var stopWatc = System.Diagnostics.Stopwatch.StartNew(); while (vehicle.Distance <= totalDistance) { // 1h is equal 1s in simulation var randomNum = random.Next(1, 101); vehicle.Distance = i * vehicle.Speed; if (randomNum <= vehicle.HeavyMalFun) { vehicle.VehicleStatus = (int)Enums.VehicleStatus.heavyMalFun; } else if (randomNum > vehicle.HeavyMalFun && randomNum <= (vehicle.LightMalFun + vehicle.HeavyMalFun)) { vehicle.VehicleStatus = (int)Enums.VehicleStatus.lightMalFun; } //Update vehicle data vehicle.Time = (stopWatc.ElapsedMilliseconds / 1000).ToString(); VehicleDataLayer.UpdateVehicle(vehicle); if (vehicle.VehicleStatus == (int)Enums.VehicleStatus.heavyMalFun) { break; } else if (vehicle.VehicleStatus == (int)Enums.VehicleStatus.lightMalFun) { Thread.Sleep(vehicle.MalfunctionTime * 1000); vehicle.VehicleStatus = (int)Enums.VehicleStatus.good; VehicleDataLayer.UpdateVehicle(vehicle); } else { VehicleDataLayer.UpdateVehicle(vehicle); Thread.Sleep(1000); } if (vehicle.Distance >= totalDistance) { vehicle.VehicleStatus = (int)Enums.VehicleStatus.finishRace; vehicle.Time = (stopWatc.ElapsedMilliseconds / 1000).ToString(); VehicleDataLayer.UpdateVehicle(vehicle); break; } i++; } return(vehicle); }