private void FireEvents(SeanseState prevState, SeanseState state) { // Eсли перешел в активный if (isActiveEnded && prevState != SeanseState.Active && state == SeanseState.Active) { isActiveEnded = false; ActiveStart.Invoke(this, new EventArgs()); } // Если Вышел из активного IEnumerable <SignalEntry> activeEntries = signalEntries.Where(x => x.Type != EntryType.Error && x.Size - x.Errors > (int)Mode); if (!isActiveEnded && activeEntries.Any() && !(activeEntries.Last().Time > (DateTime.Now - delay).AddMinutes(-config.MinutesToAwaitAfterEnd) && activeEntries.Last().Time <= (DateTime.Now - delay))) { isActiveEnded = true; ActiveEnd.Invoke(this, new EventArgs()); } // Если начал работу if (isEnded && state != SeanseState.WorkingLevel0) { isEnded = false; WorkingStart.Invoke(this, new EventArgs()); } // Если окончил работу if (!isEnded && signalEntries.Where(x => x.Time > (DateTime.Now - delay).AddMinutes(-config.MinutesToAwaitAfterEnd) && x.Time <= DateTime.Now - delay).Count() == 0) { isEnded = true; WorkingEnd.Invoke(this, new EventArgs()); } }