/// <summary> /// Register a new Region to Weather Manager /// Should not be used Externally /// </summary> /// <param name="region"></param> public void RegisterRegion(Region region) { lock (LockObject) { if (!RegionsWeather.ContainsKey(region.ID)) { try { // scope copy for thread safety var regionId = region.ID; RegionsWeather.Add(regionId, new RegionWeather(region)); RegionsTasks.Add(regionId, Scheduler.Start(() => OnWeatherTick(regionId), 1)); } catch (Exception ex) { if (log.IsErrorEnabled) { log.ErrorFormat("Error While Registering Region's Weather : {0} (ID:{1})\n{2}", region.Description, region.ID, ex); } } } else { if (log.IsWarnEnabled) { log.WarnFormat("Trying to Add Region {0} (ID:{1}) to WeatherManager while already Registered!", region.Description, region.ID); } } } }
/// <summary> /// Change Current Weather in Region /// </summary> /// <param name="regionId">Region ID where weather is changed</param> /// <param name="change">Weather Object to change</param> /// <returns>true if Weather changed</returns> public bool ChangeWeather(ushort regionId, Action <RegionWeather> change) { ScheduledTask task; lock (LockObject) { if (RegionsTasks.TryGetValue(regionId, out task)) { RegionsTasks.Remove(regionId); } } // Stopping Timer is locking on Task Thread if (task != null) { task.Stop(); } lock (LockObject) { RegionWeather weather; if (!RegionsWeather.TryGetValue(regionId, out weather)) { return(false); } if (RegionsTasks.ContainsKey(regionId)) { return(false); } try { change(weather); } catch (Exception ex) { if (log.IsErrorEnabled) { log.Error("Exception While Changing Weather: ", ex); } } // scope copy for thread safety var region = regionId; if (weather.StartTime != 0) { StartWeather(weather); RegionsTasks.Add(region, Scheduler.Start(() => OnWeatherTick(region), weather.Duration)); } else { RegionsTasks.Add(region, Scheduler.Start(() => OnWeatherTick(region), DefaultTimerInterval)); } } return(true); }
/// <summary> /// Retrieve Region Weather from Region ID /// </summary> public RegionWeather this[ushort regionId] { get { RegionWeather weather; lock (LockObject) RegionsWeather.TryGetValue(regionId, out weather); return(weather); } }
/// <summary> /// UnRegister a Stopped Region from Weather Manager /// Should not be used Externally /// </summary> /// <param name="region"></param> public void UnRegisterRegion(Region region) { ScheduledTask task; lock (LockObject) { if (RegionsTasks.TryGetValue(region.ID, out task)) { RegionsTasks.Remove(region.ID); } } // Stopping Timer is locking on Task Thread if (task != null) { task.Stop(); } lock (LockObject) { RegionWeather weather; if (RegionsWeather.TryGetValue(region.ID, out weather)) { RegionsWeather.Remove(region.ID); if (weather.StartTime != 0) { StopWeather(weather); } } else { if (log.IsWarnEnabled) { log.WarnFormat("Trying to Remove Region {0} (ID:{1}) from WeatherManager but was not registered!", region.Description, region.ID); } } } }