public void ResetData() { AbortThreads(); BusyPlaces = 0; EntranceStadiumQueue.Clear(); _securityThreads = new List <Thread>(); for (int i = 0; i < CountSecurity; i++) { _securityThreads.Add(new Thread(CheckTicket) { Name = $"Security {i}." }); } _stewardThreads = new List <Thread>(); for (int i = 0; i < CountSteward; i++) { _stewardThreads.Add(new Thread(FanAccommodationBySector) { Name = $"Steward {i}." }); } for (ushort i = 0; i < StadiumEntrance; i++) { EntranceSectorsQueue[i].Clear(); } for (ushort i = 0; i < CountSectors; i++) { SectorsPlaces[i].FansInSector.Clear(); } }
public void CheckTicket() { try { bool IsStadiumFull = false; while (!IsStadiumFull) { try { Fan fan = null; bool isTicketValid = false; int EntranceSectorsQueueCount = 0; bool hasFanInFifstQueue = false; this.Dispatcher.Invoke(() => { hasFanInFifstQueue = EntranceSectorsQueue.Count > 0 ? true : false; }); this.Dispatcher.Invoke(() => { lock (_entranceStadiumQueueLocker) { if (EntranceStadiumQueue.Count > 0) { fan = EntranceStadiumQueue.Take(1).First <Fan>(); EntranceStadiumQueue.Remove(fan); } } if (fan != null) { isTicketValid = IsTicketValid(fan);//Todo: maybe change later to have better multythread. EntranceSectorsQueueCount = EntranceSectorsQueue.Count; } }); if (fan != null && isTicketValid) { int mostShortQueueIndex = 0; int mostShortQueueLength = int.MaxValue; for (int i = 0; i < EntranceSectorsQueueCount; i++) { this.Dispatcher.Invoke(() => { if (EntranceSectorsQueue[i].Count < mostShortQueueLength) { mostShortQueueLength = EntranceSectorsQueue[i].Count; mostShortQueueIndex = i; } }); } this.Dispatcher.Invoke(() => { if (!this.IsStadiumFull()) { EntranceSectorsQueue[mostShortQueueIndex].Add(fan); } }); } } catch (Exception e) { MessageBox.Show(e.Message); } Thread.Sleep(SecuritySleep); this.Dispatcher.Invoke(() => { IsStadiumFull = this.IsStadiumFull(); }); } } catch (ThreadAbortException ex) { } finally { MessageBox.Show(Thread.CurrentThread.Name + " EndWork"); } }