Exemplo n.º 1
0
        /// <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);
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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);
            }
        }
Exemplo n.º 4
0
        /// <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);
                    }
                }
            }
        }