public void Raise(IDomainEvent domainEvent) { WriteLog($"Raising Event {domainEvent.GetType()}"); // Cache event if (FiTechCoreExtensions.StdoutEventHubLogs) { domainEvent.d_RaiseOrigin = Environment.StackTrace; } domainEvent.EventsHub = this; lock (EventCache) { if (EventCache.Any(x => x.RID == domainEvent.RID)) { return; } EventCache.RemoveAll(e => (DateTime.UtcNow - e.TimeStamp) > EventCacheDuration); } // Raise event on all listeners. List <IDomainEventListener> listeners; lock (Listeners) { Listeners.RemoveAll(l => l == null); listeners = Listeners.ToList(); } foreach (var listener in listeners) { MainQueuer.Enqueue(async() => { await listener.OnEventTriggered(domainEvent).ConfigureAwait(false); if (domainEvent.AllowPropagation) { parentHub?.Raise(domainEvent); } }, async x => { try { await listener.OnEventHandlingError(domainEvent, x).ConfigureAwait(false); } catch (Exception y) { Fi.Tech.Throw(x); } }, (b) => { return(Fi.Result()); }); } if (EnableEventCache) { lock (EventCache) { domainEvent.TimeStamp = DateTime.UtcNow; EventCache.Add(domainEvent); } LastEventDateTime = Fi.Tech.GetUtcTime(); CancelationTokenSource.Cancel(); CancelationTokenSource = new CancellationTokenSource(); } }
/// <summary> /// Изменяет размер уровня до заданных ширины и высоты. /// </summary> /// <param name="width">Ширина</param> /// <param name="height">Высота</param> public void Resize(int width, int height) { List <Block> newBlocks = new List <Block>(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { Block block = null; if (x < Width && y < Height) { block = Blocks[y * Width + x]; } newBlocks.Add(block); } } Width = width; Height = height; Blocks = new ObservableCollection <Block>(newBlocks); // Возможно, стоит сделать более серьезные проверки, но мне люто хочется спать. // Сейчас выпиливаются объекты, левый верхний угол которых лежит за пределами уровня, но учитывая // различные поправки к координатам, этот способ далеко не идеален. if (Areas != null) { Areas = new ObservableCollection <Area>( Areas.ToList().FindAll(area => area.X + area.Width < width && area.Y + area.Height < height)); } if (Listeners != null) { Listeners = new ObservableCollection <Listener>( Listeners.ToList().FindAll(listener => listener.X < width && listener.Y < height)); } if (Entities != null) { Entities = new ObservableCollection <Entity>( Entities.ToList().FindAll(entity => entity.X < width && entity.Y < height)); } OnLevelResize(); }